一,设计原则
1,找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
2,针对接口编程,而不是针对实现编程
3,多用组合,少用继承
4,为了交互对象之间的松耦合而努力
5,类应该对扩展开放,对修改关闭(开放-关闭原则)
6,要依赖抽象,不要依赖具体类(依赖倒置原则)
指导方针
(1)变量不可以持有具体类的引用
(2)不要让类派生自具体类
(3)不要覆盖基类中已实现的方法
7,只和你的密友交谈 (最少知识原则)
指导方针
我们应该只调用属于以下范围的方法:
(1)该对象本身
(2)被当做方法的参数而传递进来的对象
(3)此方法所创建或实例化的任何对象
(4)对象的任何组件
8,别调用我们,我们会调用你(好莱坞原则)
9,一个类应该只有一个引起变化的原因(单一职责原则)
二,设计模式的特点
1,知道OO基础,并不足以让你设计出好的OO系统
2,良好的OO设计必须具备可复用、可扩充、可维护三个特性 ☆
3,模式可以让我们建造出具有良好OO设计质量的系统
4,模式被认为是历经验证的OO设计经验
5,模式不是代码,而是针对设计问题的通用解决方案
6,模式不是被发明,而是被发现
7,大多数的模式都允许系统局部改变独立于其他部分☆
8,我们常把系统中会变化的部分抽出来封装☆
9,模式让开发人员之间有共享的语言,能够最大化沟通的价值☆
三,设计模式
1,策略模式
策略模式定义了算法族,分别封装起来,让他们之间可以互相转换,此模式让算法的变化独立于使用算法的客户。
理解:
策略模式就是将对象的行为封装进一组类中,可以被轻易的扩充和改变,如果需要,甚至在运行时也可以改变行为。将可以互换的行为封装起来,然后使用委托的方法,决定使用哪一个行为
2,观察者模式
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新
例子:
Java提供的观察者模式包
3,装饰者模式
装饰者模式动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
例子:
I/O
4,工厂方法模式
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。
理解:
所有工厂模式都用来封装对象的创建,工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。
简单工厂和工厂方法模式的区别:
简单工厂把全部的事情,在一个地方都处理完了,而工厂方法却是创建一个框架,让子类决定要如何实现。简单工厂的做法,
可以将对象的创建封装起来,但是简单工厂不具备工厂方法的弹性,因为简单工厂不能变更正在创建的产品。
5,抽象工厂模式
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类
抽象工厂和工厂方法模式的区别:
(1)都负责创建对象,工厂方法用的是继承,抽象工厂用到的是组合
(2)都能将对象的创建封装起来,使应用程序解耦,并降低其对特定实现的依赖。
(3)当需要创建产品家族和想让制造的相关产品集合起来的时候使用抽象工厂,当需要把客户代码从需要实例化的具体类中解耦的时候使用
工厂方法。
(4)工厂方法提供一个抽象接口来创建一个产品,由每个子类决定实例化哪个具体类。
抽象工厂提供一个抽象接口用来创建一个产品家族,每个具体子类都创建一个家族的产品,这些具体在抽象工厂中创建产品的方法,通常是以工厂方法实现的。
6,单件模式
确保一个类只有一个实例,并提供一个全局访问点
7,命令模式
命令模式将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
8,适配器模式
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
对象适配器使用组合的方式完成适配,而类适配器采用继承的方式完成适配。
9,外观模式
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
外观模式和适配器模式的区别:
外观和适配器可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成不同的接口。
10,模板方法模式
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法的结构下,重新定义算法中的某些步骤。
例子:
Array.sort
理解:
由子类决定如何实现算法中的某些步骤
注意:
策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
工厂方法是模板方法的一种特殊版本。
11,迭代器模式
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
12,组合模式
组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象集合。
13,状态模式
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类
理解:
封装基于状态的行为,并将行为委托到当前状态
14,代理模式
代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问
例子:
远程代理 虚拟代理 动态代理
15,复合模式
复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。
四,概念
1,模式
模式是在某情境下,针对某问题的某种解决方案。
2,松耦合
当两个对象之间松耦合,他们依然可以交互,但是不太清楚彼此的细节。
松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。
3,工厂
工厂处理创建对象的细节
4,静态工厂
不需要使用创建对象的方法来实例化对象,但是不能通过继承来改变创建方法的行为。
5,内聚
用来度量一个类或模块紧密的达到单一目的或责任
当一个模块或一个类被设计成只支持一组相关的功能时,我们说他具有高内聚;反之,当被设计成支持一组不相关的功能时,我们说他具有低内聚。
五,MVC模式
1,模型利用"观察者"让控制器和视图可以随最新的状态改变而更新。
2,视图和控制器实现了“策略模式”,控制器是视图的行为,如果你希望有不同的行为,可以直接换一个控制器。
3,视图内部采用组合模式来管理窗口、按钮和其他组件。
六,模式分类
1,创建型:
builder生成器模式 prototype原型模式 singleton单例模式 abstract factory 抽象工厂模式 factory method 工厂方法
2,结构型:
decorator装饰者模式 composite 组合模式 proxy代理模式 adapter适配器模式 facade外观模式 flyweight蝇量模式 bridge桥接模式
3,行为型:
template method 模板方法 command命令模式 iterator 迭代器模式 observer观察者模式 state状态模式 strategy策略模式
visitor访问者模式 mediator中介者模式 memento备忘录模式 interpreter解释器模式 chain of responsibility 责任链模式
七,其他模式
1,桥接模式
使用桥接模式不只改变你的实现,也改变你的抽象
2,生成器模式
使用生成器模式封装一个产品的制造过程,并允许按步骤构造
3,责任链模式
当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式
4,绳量模式
如想让某个类的一个实例能用来提供许多“虚拟实例”,就使用绳量模式
5,解释器模式
使用解释器模式为语言创建解释器
6,中介者模式
使用中介者模式来集中相关对象之间复杂的沟通和控制方式
7,备忘录模式
当你需要让对象返回之前的状态时,就使用备忘录模式
8,原型模式
当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式
9,访问者模式
当你想要为一个对象的组合增加新的能力,且封装并不重要时,就使用访问者模式