随笔分类 - Design Pattern
23 design pattern.
摘要:代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。 一般代理模式类图: 远程代理:Java RMI RMI:远程方法调用,提供客户辅助对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法。RMI的好处在于不必亲自写任何网络或I/O代码。客户程序调用远程方法(真正的服务)就和在运
阅读全文
摘要:解释器模式:为语言创建解释器,提供评估语言的语法或表达式的方法。 例子: 测试结果: 在JAVA中,使用解释器模式的地方很少,expression4j框架是基于Java的开源框架,它用于对数学表达式进行操作,是一个数学公式解析器。它是应用解释器模式的最佳例子,但目前这个框架仍在完善的过程中。
阅读全文
摘要:备忘录模式:保存一个对象的某个状态,以便在适当的时候恢复对象。 例子: 测试结果: 我们在不破坏封装的前提下,捕获了Adventor内部的状态state,并把这个状态保存在Memento中,通过一个MementoManager来管理Memento。在Adventor类中的saveStateToMem
阅读全文
摘要:访问者模式:使用一个访问者类,改变元素的行为。通过这种方式,随着访问者的改变,被访问者的行为可以被改变。 类图: 实现Master接口的具体类是行为需要被改变的对象。 实现Visitor接口的具体类是访问者,访问者不同,实现Master接口的具体类的行为不同。 测试结果:
阅读全文
摘要:空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系。(消除如if(Object == null) 这样的检查null实例代码) 例子: 如果要求的对象不存在,不是返回null,而是返回空对象,这样代码会比使用条件判断更加"优雅"。
阅读全文
摘要:中介者模式:集中相关对象之间复杂的沟通和控制方式。 模式结构图: 例子: 在这里ChatRoom是一个中介者,有多个User会使用中介者,形成一个用户间的聊天室,如果以后添加一个管理员与用户沟通,就不需要修改User代码了(当然中介者的代码需要修改,因为要添加处理管理员与用户之间交互的功能),只要加
阅读全文
摘要:蝇量模式:让某个类的一个实例能用来提供许多“虚拟实例”。 在有大量对象时,有可能造成内存溢出,把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重复创建。(JAVA中的String,如果没有则创建一个字符串保存在字符串常量池里,否则直接返回) 类图: 某次测试结果: C
阅读全文
摘要:责任链模式:可以为某个请求创建一个对象链。每个对象依序检查此请求,并对其处理,或者把它传给链中的下一个对象。 责任链上的对象负责处理请求,客户只需要将请求发送到责任链上即可,无需关心处理的细节和请求的传递,所以请求的发送者和接收者解耦了。 类图: 具体例子: 一个Logger日志抽象类,三个具体日志
阅读全文
摘要:模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法的结构下,重新定义算法中的某些步骤。 这个模式是用来创建一个算法模板。模板就是一个方法。更具体地说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构
阅读全文
摘要:策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 下面举个例子: 有两个具体策略,分别执行两个整型加法和减法。 如此一来,就能在运行时改变选择的策略,具体策略与客户解耦了,就算具体策略的细节被改变,客户也不需要知道。
阅读全文
摘要:状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 这个模式将状态封装成为独立的类,并将动作委托到代表当前对象的对象,这样行为就与拥有状态类解耦了。 从客户的角度来看,对象的行为被完全改变,好像对象是从别的类实例化而来,但实际上我们是使用组合通过简单引用不同的状态对象来造成
阅读全文
摘要:迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 类图: 下面举一个例子: 对于数组,jdk并没有迭代器的实现,如果我们有一个数组对象,要隐藏其访问细节,就只能自己实现一个迭代器。 现在餐厅有一个菜单,女招待员有一个printMenu方法,打印出AMenu菜单上的所
阅读全文
摘要:观察者模式:定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 下面举一个具体例子: 两个观察者,BinaryObserver的update将setState传入的整数转换成二进制,OctaObserver则是转成八进制 测试代码: 在Swing中有使
阅读全文
摘要:命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。 模式类图: 下面举一个具体的例子: 有一个遥控器类RemoteControl,它可以控制Light类的行为,一个Command命令接口,两个实现Command接口的具体命令,分别实现开灯、
阅读全文
摘要:外观模式:提供一个统一的接口,用来访问子系统中的一群接口。外观定义一个高层接口,让子系统更容易使用,但没有将子系统“封装”起来,如果客户需要复杂的子系统功能,依旧可以直接使用子系统的类。特征:提供简化接口的同时,依然将系统的完整功能暴露出来,以供需要的人使用。 下面举个具体的例子: 如果我们要做一个
阅读全文
摘要:装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供比继承更有弹性的替代方案。 下面来看个具体的例子 在java.io中就有使用到装饰者模式,下面是类图,注意,类图中的具体组件和装饰者仅列出部分,java中还有其他的具体组件和装饰者没有画出来,仅画出例子中需要用到的类。 在这个例子中,Fi
阅读全文
摘要:组合模式:把一组相似的对象当成一个单一的对象,依据树形结构来组合对象,用来表示部分和整体层次。 举一个管理公司员工的例子: 测试代码: 组合模式适合处理树形结构问题,如树形菜单,文件夹文件管理。
阅读全文
摘要:桥接模式,用于将抽象化与实现化解偶,使得二者可以独立变化。 举一个数据库JDBC的例子: 定义一个Driver接口,不同的数据库实现的接口,如MySQL,SQLServer MySQL具体类: SQLServer具体类: 一个桥接类: 测试代码: 利用DriverManager作为桥接类,将不同数据
阅读全文
摘要:适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口互相不兼容而不能一起工作的类可以一起工作。 有一个鸭子接口: 绿头鸭是鸭子的子类: 有一个火鸡接口,不会呱呱叫,只会咯咯叫,与鸭子的不同,没有quack(),而是gobble(): 一个野生的火鸡,实现火鸡接口: 如何用火鸡冒充
阅读全文
摘要:原型模型:用于创建重复对象,同时保证性能。 这种模式实现一个原型接口,用于创建对象的克隆,当直接创建对象的代价比较大,则可以采用这种模式。例如:一个对象需要高代价的数据库操作之后被创建,这时可以缓存该对象,在下次请求时返回其克隆,不必在进行高代价的数据库操作。 下面将创建一个抽象类Pizza,再定义
阅读全文
浙公网安备 33010602011771号