设计模式个人笔记

来源:互联网 发布:java培训班讲课进度 编辑:程序博客网 时间:2024/04/29 02:23

1.里氏代换原则 

  里氏代换原则 与 OCP保持着一致性,子类应该避免重写父类已经实现的方式:关闭--保护那些引用了父类的而实现的模块的已有功能的一致性,不至于出现,将父类用子类替换后,原有模块的功能行为出现异常,开放--对扩展开放,可以添加新的方法,供新增加的功能或者要变化的地方使用。

解决方案之一:如果要重写父类的方式,那么就再写一个新的基类,封装当前子父类相同部分,抽象变化部分,然后分别集成,这样就让两个类并列起来了。

2.工厂模式与建造者模式

      在这里我们着重看下建造者(Builder)模式与工厂(Factory)(主要是AbstractFactory)模式间的关系。两者很相似,都是用来创建同时属于几个产品族的对象的模式。不同之处在于--AbstractFactory模式中(相对简单产品),每一次工厂对象被调用时都会返回一个完整的对象,至于client如何处理该对象与工厂自身无关;Builder模式(相对复杂产品,侧重产品组装流水),它则是一点一点地建造出一个复杂的产品,而这个产品的组装过程就发生在builder角色内部。这两种模式,AbstractFactory更加微观,而Builder更加宏观。一个系统可以由一个bulider和一个AbstractFactory组成,client通过调用这个builder角色,间接地调用另一个AbstractFactory角色,AbstractFactory模式返还不同产品族的零件,而Builder模式则把他们组装起来。
参看创建模式之工厂、工厂方法、抽象工厂与建造者

抽象工厂,返回的是一系列的产品族中的产品组件;建造者模式,返回的是产品族对应的最终成型产品。如:台式电脑,按照CPU分类,有Intel系列(一个产品族)和AMD系列(一个产品族):包含有 CPU 主板 内存条 硬盘 等(产品组件)。intel系的抽象工厂对象可以返回这一系列的 产品组件给客户端,客户端知道太多的产品细节,如果用户只想要一台可用的电脑,那么我们就可以采用建造者模式,直接为其生成产品组件 组装成的最终产品,并可检测最终产品的完整性与可用性。
建造者模式可以结合模板模式实现默认设置,与局部数据修改。参见 (Builder)建造者模式的Java实现

3.原型模式与单例模式

  • 单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。
  • 深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝

4.模板方法模式

模板方法模式的一个弊端是,一个模板中有多个抽象方法f1,f2,f3,f4,f5,但是对于他的派生类有A,B,C。B对于A的区别,仅仅在于一个方法f2的不同,那么这个时候,就会涉及多个方法(f1、f3等)代码的重复。
模板方法模式钩子方法的使用 参见:钩子方法的使用

5.访问者模式

为何要“双重分派”,为何要accept()方法,为何不直接visit()?Visitor模式——关于双重分派
为何使用双重分派,是为了避免访问时候的“伪动态”导致的问题,细节设计在这里体现的淋漓尽致,请参看:访问者模式讨论篇:java的动态绑定与双分派
设计的时候,依赖总是单向的。(#add 注意,要避免双向依赖。一般来说,不应该存在双向依赖。)     但是,在双重分派中,就是巧妙的运用了双向依赖构建的。


6.状态模式与命令模式

命令模式关注的是 请求发送者与请求接受者的解耦,状态模式关注的是,对象状态的内部变化引起的行为变化。命令模式,对于同一个命令的执行是一致的,而状态模式会对同一操作表现出不同的行为。
命令模式:派生类不会感知彼此的存在;如 灯的OpenCommand命令 和 OffCommand,OpenCommand--会让灯一致亮着,而不会关心当前灯的状态(灯如果亮着,你不停的给他命令让他亮着,是很多余的),对于OffCommand 也是的。灯当前的状态不会影响他对同一请求的处理。
状态模式:派生类一定程度知道其他兄弟类的存在,知道自己的上一个状态或者下一个状态是谁;如,灯,现在是拉线开关,你扯一下,灯亮了OpenState,你再扯一下OffState,是按照一定的顺序来切换的,灯当前的状态会影响到他对同一请求的处理。

7.状态模式和职责链模式

职责链模式:一个请求可能被多人 依次处理。链的方向由外部确定。一个请求可被多次处理,或者不被处理。外链。
状态模式:强调对象内部状态的变化对其外在行为的影响。链的方向内部指定,当前状态,知道下一个状态,客户端不关心状态的方向。内链。而且一个请求只会被当前状态对应的一种行为模式所处理。

桥接模式与其他相似模式的区别 http://chjavach.iteye.com/blog/756233
0 0
原创粉丝点击