设计模式之禅读书笔记

》设计原则《

》Single Responsibility Principle(单一职责原则)类只有一个修改的原因。

  ●类的复杂性降低,实现什么职责都有明确的定义。

  ●可读性高

  ●可维护性高

  ●变更引起的风险降低。

PS:基本不可能实现

》里氏替换原则:只要父类可以出现的地方,子类就可以出现。

》Dependence  Inversion Principle(依赖倒置原则)

  ●高层次模块不应该依赖低层模块,两者都应该依赖抽象。

  ●抽象不应该依赖细节,细节应该依赖抽象

》接口隔离原则:类之间的依赖关系应该建立在最小的接口上。

》迪米特法则:一个对象应该对其他对象有最少的理解。

》开闭原则:对扩展开放,对修改关闭。

  ●逻辑变化

  ●子模块变化

  ●可见视图变化

设计模式

》单例模式(Singleton Pattern):要求一个类只能生成一个对象,所有对象对他的依赖都是相同的。

类图:

优点:

  ●较少了内存开支,性能开销。避免对资源的多重占用。

  ●优化和共享资源访问。

缺点:

  ●扩展困难。对测试不利。

使用场景:

  ● 生成唯一序列号的环境。

  ●需要一个共享的访问点或共享数据。如web上的计数器。

  ●创建对象需要耗费的资源过多。如访问IO资源。

注意事项:

  ●线程同步的问题。

最佳实现:

  ● 在Spring中,每个Bean默认都是单例的。

》工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个对象。

类图:

优点:

  ●良好的封装。代码结构清晰。

  ●扩展非常优秀。

  ●屏蔽产品类。

扩展:

  ● 缩小为简单工厂。

  ●升级为多个工厂类。

  ●替代单例模式

  ●延迟初始化。

》抽象工厂模式:为创建一组相关或依赖的对象提供一个接口,却无需指定它们的具体类。

类图:

优点:

  ●封装性,工厂类创建需要的对象。

  ●产品族的约束为非公开的状态。

缺点:

  ● 产品族扩展非常困难。

》模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类,使得子类可以在不改变一个算法的结构即可重新定义该算法的某些特定步骤。

类图:

  ●注:在软件开发的过程中,如果相同的代码拷贝过两次,就要对设计产生怀疑。

  ●为了防止恶意的操作,一般模板方法都加上final关键字,不如许复写。

优点:

  ●封装不变的部分,扩展可变的部分。

  ●提取公共代码,便于维护。

  ● 行为由父类控制,子类实现。

缺点:

  ●子类对父类产生了影响,会带来代码的阅读难度。

使用场景:

  ●可以把核心算法设计为模板方法。

  ●重构时,把相同的代码抽取到父类。

扩展:

  ●增加钩子方法,也就是说外界条件改变,影响到模板方法的执行。

》建造者模式:将一个复杂对象的构建与他的表示分离。是得同样的构建过程可以创建不同的表示。

  ● ArrayList和HashMap如果定义成类的成员变量,那你的方法中的调用一定要做一个clear的动作。以防数据混乱。

类图:

  ●product产品类:通常是实现了模板方法模式。

  ●Builder抽象构建者:规范产品的组件。一般由子类实现。

  ●ConcreteBuilder:实现抽象类所定义的方法,并返回一个组建好的对象。

  ●Director导演:负责安排已有的顺序。起到封装的作用。

优点:

  ●可以使客户端不必知道产品内部组成的细节。

  ●建造者独立,容易扩展。

  ● 便于控制细节。

使用场景:

  ●相同的方法,不同的执行顺序,产生不同的结果。

  ●多个部件,都可以装配到一个对象中,但是产生的运行结果有不同。

  ●产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能。

》代理模式:为其他对象提供一个代理以控制这个对象的访问。

类图:

  ●subject主题角色:普通的业务类型定义。

  ● Realsubject:业务逻辑的具体执行者。

  ●proxy:调用真实的类。

优点:

  ● 职责清晰,真实的角色实现实际的业务逻辑。不必关心其他的事情。

  ● 高扩展性:不管具体的主题如何变化,代理类都可以不用变。

注:String AOP是一个典型的动态代理的应用。

》》原型模式:用原型实例指定创建对象的种类。并且通过拷贝这些原型创建新的对象。

类图:

优点:

  ●  性能优良,原型模式是二进制流的拷贝,要比直接new一个性能好的多。

  ● 逃避构造函数的约束。

注:执行拷贝的时候不会运行构造函数。

  ● 浅拷贝:clone只拷贝本对象,其对象内部的数组,引用对象不拷贝。

注:在使用原型模式的时候,引用的成员变量必须是成员变量与是一个可变的引用变量才不会被拷贝。

  ●深拷贝:把引用变量单独拷贝。

注:深拷贝与浅拷贝不要混合使用。

      对象的clone与对象的final关键字是冲突的。要是用clone方法,就不要使用final。

》》中介者模式:用一个中介对象封装一系列对象的交互,中介者使各对象不需要显示地相互作用。从而松耦合。也可以独立的改变他们之间的交互。

类图:

  ●优点:减少类的依赖。降低了类之间的耦合度。

  ●缺点:中介者会膨胀的很大,逻辑复杂。

  ●MVC:C就是一个中介者。

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

  ●

 

 未完待续。。。。。。

 

posted @ 2016-04-07 15:19  戎码一生  阅读(361)  评论(0编辑  收藏  举报