




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java 几种常用设计模式简单示例 模式概述 设计模式可确保通过熟知和公认的解决方案解决常见问题。模式存在的事实基础在 于: 大多数问题,可能已经有其他个人或开 发小组解决过了。因此,模式提供了一种在开 发人员 和组织之间共享可使用解决方案的形式。无论这些模式的出 处是什 么,这些模式都利用了 大家所积累的知识和经验。这 可确保更快地开发正确的代 码,并降低在 设计或实现中出现错 误的可能性。此外,设计模式在工程小组成员之间 提供了通用的术语。参加过大型开发项目 的人员都知道,使用一组共同的 设计术语和准则对成功完成 项目来说是至关重要的。最重要 的是,如果能正确地使用,设计 模式可以节省您大量的时间。 要想在设计中正确地运用一个设计模式,需要考 虑以下条件: 1. 弄清你的问题的本质; 2. 了解这个模式; 3. 理解这个模式如何解决你的问题。 1.单例设计模式 所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类 (Singleton 类)永远只会有一个实例化对象产生。 Singleton 是一种创建型模式,指某个类采用 Singleton 模式,则在这个 类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点 特点: 1、 无论程序如何运行,该类(Singleton 类)永远只会有一个实例化 对象产生 2、 在这个类被创建后,只可能产生一个实例供外部访问,并且提供一 个全局的访问点 具体实现步骤如下: (1) 将采用单例设计模式的类的构造方法私有化(用 private 修饰)。 (2) 在该类的内部产生该类的实例化对象,并将其封装成 private static 类 型。 (3) 定义一个静态方法获取该类的实例。 代码示例: 饿汉式: /* * 单例模式之 饿汉式:-线程安全,效率低 * 特点:在类 加载时就已 经创建好对象 * author Darren Ho * */ public class Singleton / 将构造方法封装为私有化 ,指明仅在类内部使用 private Singleton () / 在内部产生本类的实例化对象,将其封装成private static类型 Private static final Singleton instance = new Singleton(); /通过静态方法获取instance对象 public static Singleton getInstance() return instance; 懒汉式: /* * 单利模式 值懒汉式: 线程不安全,要运用同步锁 * author Darren Ho * */ public class SingletonLazy private SingletonLazy() private static SingletonLazy instance; public static SingletonLazy getInstance() if (instance = null) synchronized (SingletonLazy.class) if (instance = null) instance = new SingletonLazy(); return instance; 2.工厂设计模式 程序在接口和子类之间加入了一个过渡端(工厂类),通过此过渡端可以 动态取得实现了共同接口的子类实例化对象。 一个对象相关的职责通常有三类: 对象本身所具有的职责、创建对象的职责和使用对象的职责。 对象本身的职责:就是对象自身所具有的一些数据和方法,可通过一些公开的 方法来实现它的职责。 对象的创建职责和使用职责(开发中要将两者分开,不能耦合在一个对象中, 减少代码的维护工作) - - - -工厂模式的优点 在所有的工厂模式中,我们都强调一点:两个类 A 和 B 之间的关系应该仅 仅是 A 创建 B 或是 A 使用 B,而不能两种关系都有。 在 Java 语言中,我们通常有以下几种创建对象的方式: (1) 使用 new 关键字直接创建对象; (2) 通过反射机制创建对象; (3) 通过 clone()方法创建对象; (4) 通过工厂类创建对象。 工厂模式优点: 1. 将对象的创建和使用分离,也使得系统更加符合“单一职责原 则”,也有利于开闭原则,即有利于对功能的复用和系统的维 护。 2. 将对象的创建和使用分离还有一个好处:防止用来实例化一个 类的数据和代码在多个类中到处都是,可以将有关创建的代码 搬移到一个工厂类中。 3. 可以引入工厂类来封装对象的创建逻辑和客户代码的实例化/配 置选项。 缺点:工厂没有可以提供实例的逻辑,必须修改源代码 3.代理设计模式 指由一个代理类来操作被代理类,被代理 类执行具体的业务 操作,而 代理类负责其他 相关业务的处理。比如生活中的通 过代理访问网络,客 户通 过网络代理连接网络(具体 业务),由代理服务器完成用户权 限和访问限制等与上网相关的其他操作(相关 业务)。 静态代理模式: 静态代理模式实现步骤: 1)创建一个接口 2)创建一个委托类/ 被代理类,该类实现以上的接口 3)创建一个代理类,该代理类也实现以上接口(重写此方法) 并且声明一接口类型的引用变量,然后在代理类的构造器中初始化 4)在应用时: 1. 先创建委托类 2. 再创建代理类并将委托类的对象传入代理类的构造器中; 3. 最后调用代理类实现了接口的方法 动态代理模式: 动态代理类特点: 动态代理类的源码是在程序运行期间由 JVM 根据反射等机制动态的生成, 所以不存在代理类的字节码文件,无需程序员手工编写它的源代码。即- -动态生成代理类。 动态代理类和委托类的关系是在程序运行时确定。 动态代理可以让系统能够根据实际需要来动态创建代理类,让同一个代 理类能够代理多个不同的委托类而且可以代理不同的方法。 动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为 Java 反射机制可以生成任意类型的动态代理类。 动态代理实现步骤 : 1.通过实现 InvocationHandler 接口创建自己的调用处理器 ; 2.通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类; 3.通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接 口类型;- -Proxy.newInstance() 4.通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。 注意:Java 语言实现动态代理时需要用到位于 java.lang.reflect 包中的一些类: Proxy 类和 InvocationHandler 接口提供了生成动态代理类的能力。 Proxy 类主要用来获取动态代理对象,InvocationHandler 接口用来约束调用者 实现 (1) Proxy 类 Proxy 类提供了用于创建动态代理类和实例对象的方法,它是所创建的动态 代理类的父类,它最常用的方法如下: 1. public static Class getProxyClass(ClassLoader loader,Class. interfaces):该方法用于返回一个 Class 类型的代理类,在参数中需要提 供类加载器并需要指定代理的接口数组 2. public static ObjectnewProxyInstance(ClassLoader loader, Classinterfaces, InvocationHandler h): 该方法用于返回一个动态创建的代理类的实例 该方法返回实现了被代理类所实现的所有接口的 Object 对象,即动态代理, 需要强制转型 特点: 参数 loader 表示代理类的类加载器 - - - 指定代理对象由哪一个类 加载器负责加载 参数 interfaces 表示代理类所要实现的接口列表,这些接口被代理类已实 现 - -指明代理对象的类型 -委托类.getInterfaces() 获取 参数 h 表示所指派的调用处理程序类- - - - 代理类与处理类相关 联 当一个代理实例中的业务方法被调用时将自动调用处理类中的 invoke()方法。 handler : 调用处理器的对象, 用于真正调用处理程序 -当调用代理对象 中的方法时,转调处理器的对象的 invoke()方法 (2) InvocationHandler 接口 InvocationHandler 接口是代理处理程序类的实现接口,该接口作为代理实 例的调用处理者的公共父类, 每一个代理类的实例都可以提供一个相关的 具体调用处理者(InvocationHandler 接口的子类)。 在该接口中声明了如下方法: public Objectinvoke(Object proxy, Method method, Object args): 该方法用于处理对代理类实例的方法调用并返回相应的结果,当一个代理实例 中的业务方法被调用时将自动调用该方法。 注意:动态代理类需要在运行时指定委托类所实现了所有接口,当 在调用动态代理对象的业务方法时,调用请求会将请求自动转发给 InvocationHandler 对象的 invoke()方法,由 invoke()方法来实现对请求的统一 处理。 特点: Object proxy 表示动态代理类的实例 Method method 表示代理类中正在调用的方法-每次只能是一 个方法的方法对象 Object args 表示调用方法的参数数组 动态代理对象调用业务方法 - - - -调用请求 - -自动转发-处理类 对象的 invoke() - -实际调用委托类中的方法 提示:若处理类对象的 invoke()中,method.invoke(obj,args)的 obj 指 定为代理类对象,则陷入死循环 method.invoke(obj,arg)中:obj 应指定为委托类对象, 是该方法对象所在的类对象实例;表示调用那个对象的方法 注意:实现 invoke()方法,实现对请求的统一处理,实际调用在委托类中定 义的方法 4、观察者设计模式 Observer 模式是一种常用的设计模式, 尤其是在界面设计中被广泛应用。 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个 主题对象。 这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动 更新自己。 体现的设计原则是:为了交互对象之间的松耦合设计而努力。 Observer 模式的优点: 1、 解除了观察者和目标之间的耦合关系。目标不需要知道它的观察者的任 何信息。 2、 目标只是允许观察者订阅事件。当目标产生一个事件时,它简单地将事 件传给每一个观察者。 3、 观察者模式实现了动态联动 所谓联动,就是做一个操作会引起其它相关的操作。由于观察者模式对观察者注 册实行管理,那就可以在运行期 间,通 过动态的控制注册的 观察者,来控制某个动作 的联动范围,从而实现动态联动 。 4、 观察者模式支持广播通信 由于目标发送通知给观察者是面向所有注册的观察者,所以每次目标通知的信息 就要对所有注册的观察者进行广播。当然,也可以通过在目标上添加新的功能来限制 广播的范围。 特点: 1 观察者模式定义了一个一对多的依赖关系, 让一个或多个 观察者对象监察一个主 题对象。 2、 通过 1 中,一个主题对 象在状态上的变化能够通知所有的依 赖于此对象的那 些观察者对象,使这些观察者 对象能够自动更新。 3、 适用场景 (1)当一个对象的改变需要给变其它对象时,而且它不知道具体有 多少个对象有待改变时。 (2)一个抽象某型有两个方面,当其中一个方面依赖于另一个方面, 这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地 改变和复用。 观察者模式的组成 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题 角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者 角色。一般用一个抽象类和接口来实现。 抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更 新自己。 具体主题角色:实现抽象主题角色接口,在具体主题内部状态改变时,给所有 登记过的观察者发出通知。具体主题角色通常用一个子类实现。 具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身 的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可 以保存一个指向具体主题角色的引用。 观察者模式的类图 /抽象观察者角色 public interface Watcher public void update(String str); /抽象主题角色,watched:被观察 public interface Watched public void addWatcher(Watcher watcher); public void removeWatcher(Watcher watcher); public void notifyWatchers(String str); /具体观察者: public class ConcreteWatcher implements Watcher Override public void update(String str) System.out.println(str); /具体主题角色 public class ConcreteWatched implements Watched / 存放观察者 private List list = new ArrayList(); Override public void addWatcher(Watcher watcher) list.add(watcher); Override public void removeWatcher(Watcher watcher) list.remove(watcher); Override public void notifyWatchers(String str) / 自动调用实际上是主题进行调用的 for (Watcher watcher : list) watcher.update(str); 思考观察者模式 1:观察者模式的本质 观察者模式的本质:触发联动。 当修改目标对象的状态的时候,就会触发相应的通知,然后会循环调用所有注册的 观察者对象的相应方法,其实就相当于联动调用这些观察者的方法。 而且这个联动还是动态的,可以通过注册和取消注册来控制观察者,因而可以在程 序运行期间,通过动态的控制观察者,来变相的实现添加和删除某些功能处理,这些功能 就是观察者在 update 的时候执行的功能。 同时目标对象和观察者对象的解耦,又保证了无论观察者发生怎样的变化,目标对象总是 能够正确地联动过来。 理解这个本质对我们非常有用,对于我们识别和使用观察者模式有非常重要的意义, 尤其是在变形使用的时候,万变不离其宗。 2:何时选用观察者模式 建议在如下情况中,选用观察者模式: 当一个抽象模型有两个方面,其中一个方面的操作依赖 于另一个方面的状态 变化,那么就 可以选用观察者模式,将这两者封装成 观察者和目标对象,当目标对象变化的时候,依赖于 它的观察者对象也会发生相应的变化。 这样就把抽象模型的 这两个方面分离开了,使得它 们可以独立的改变和复用。 如果在更改一个对象的时候,需要同 时连带改变其它的 对象,而且不知道究竟 应该有多少对 象需要被连带改变,这种情况可以 选用观察者模式,被更改的那一个对象很明显就相当于是 目标对象,而需要连带修改的多个其它 对象,就作 为多个观 察者对象了。 当一个对象必须通知其它的对象,但是你又希望 这个对 象和其
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年新能源汽车工程师考试试题及答案
- 2025年网络工程师资格考试题及答案
- 2025年风险管理与控制考试试卷及答案解读
- 2025年西方经济学基础知识考试试题及答案
- 医药行业MBO股权收购与人才发展战略整合协议
- 微信小程序电商代运营跨境电商合作框架协议
- 美妆品牌购物中心美妆专区品牌委托经营与产品研发合同
- 短视频社交型移动应用(APP)开发与运营管理协议
- 高端影视特效化妆假发胶水租赁与化妆效果优化协议
- 丹麦电商平台入驻与北欧生活方式营销服务协议
- 小学学校规范教材和教辅资料征订管理暂行办法
- JT-T-1178.2-2019营运货车安全技术条件第2部分:牵引车辆与挂车
- 广东省广州中考近5年中考真题高频词502
- 2024年成都影视城文化传媒有限公司招聘笔试冲刺题(带答案解析)
- 2021年上海市普通高中学业水平合格性考试历史试卷
- 2024中考地理复习知识要点提纲(-商务星球版-)
- MOOC 科技英语翻译-南京航空航天大学 中国大学慕课答案
- 吸脂手术护士的配合
- 数字贸易学 课件 第10章 开放型全球数字贸易平台
- 电力工程挂靠协议书
- 小学六年级数学100道题解分数方程
评论
0/150
提交评论