设计原则
- 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
- 针对接口编程, 而不是针对实现编程。
- 多用组合,少用继承。
- 为了交互对象之间的松耦合设计而努力。
- 类应该对扩展开放,对修改关闭。
- 要依赖抽象,不要依赖具体类。
- 最少知识原则:只和你的密友谈话。
- 好莱坞原则:别调用我们,我们会调用你。
- 一个类应该只有一个引起变化的原因。
1. 开闭原则(Open Close Principle)
对扩展开放,对修改关闭。
2.里氏代换原则(Liskov Substitution Principle)
任何基类可以出现的地方,子类一定可以出现。
3.依赖倒转原则(Dependence Inversion Principle)
针对接口编程,依赖于抽象而不依赖于具体。
4.接口隔离原则(Interface Segregation Principle)
使用多个隔离的接口,比使用单个接口要好。
5.迪米特法则(最少知道原则)(Demeter Principle)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6.合成复用原则(Composite Reuse Principle)
尽量使用合成/聚合的方式,而不是使用继承。
定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
确保一个类只有一个实例,并提供一个全局访问点。
将"请求"封装成对象,以便使用不同的请求、队列或者日志来参数化其它对象。命令模式也支持可撤销的操作。
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。
提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
为另一个对象提供一个替身或占位符以控制对这个对象的访问。
其它模式
将抽象与实现分离,使它们可以独立变化。
运用共享技术来有効地支持大量细粒度对象的复用。
将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。
定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。
参考
1.《HeadFirst设计模式》
2.http://c.biancheng.net/design_pattern/