1、单一职责原则
就一个类而言,应该仅有一个引起它变化的原因。软件设计真正要做的许多内容,就是发现职责并把这些指责相互分离。
2、开发-封闭原则
软件实体应该可以扩展,但是不可修改。对于扩展是开放的,对于更改是封闭的。
3、依赖倒置原则
抽象不应该依赖细节,细节应该依赖于抽象。针对接口编程,不要对实现编程。依赖倒置其实说的是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者抽象接口,那就是面向对象编程,否则是面向过程编程。
4、里氏代换原则
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。在软件里,将父类都替换成它的子类,程序的行为没有变化。
5、装饰模式
装饰模式有效地把类的核心职责和装饰功能区分开了,而且可以去除相关类中的重复的装饰逻辑。定义一个接口Component,该接口可以动态添加职责;ConcreteComponent是接口的具体实现类。Decorator抽象类也实现Component接口,负责扩展ConcreteComponent的功能,Decorator类下面有各种具体的装饰类ConcreteDecorator,负责在特殊情况下执行特殊的行为。
6、代理模式
为其他对象提供一种代理以控制对这个对象的访问。主类可以定义为抽象类也可以定义为接口,里面提供了要完成的职责,真实的请求者继承该抽象类或者接口,代理类也继承该抽象类或者接口,同时代理类会用请求者类生成对象,并调用请求者的方法。远程代理,为一个对象在不同地址空间提供局部代表,可以隐藏一个对象存在于不同地址空间的事实,WebService就是典型应用。虚拟代理,根据需要创建开销很大的对象,通过代理存放实例化需要很长时间的真实对象。
7、工厂方法模式
该模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。简单工厂模式在于工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
8、模板方法模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。定义一个抽象类,抽象类中定义多个抽象方法,此外有一个模板方法调用这些抽象方法。具体类继承该抽象类,实现其抽象方法。然后由具体类生成的对象则调用模板方法。
9、迪米特法则
如果两个类不必彼此直接通信,那么这两个类就不应当发生直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。强调的是类之间的松耦合,尽量降低成员的访问权限。
10、外观模式
为子系统的一组接口提供一个一直的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观类对各个子系统类进行实例化,然后提供一些公有方法,这些方法中调用子系统的方法,然后对外界只公开外观类的方法。外观类的好处是降低耦合。
11、建造者模式
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式由产品、建造类、具体建造类和指挥类组成。建造类是抽象类,提供多个抽象的建造的方法,具体建造者类继承抽象类,并重载这些方法,给出具体实现。指挥者类提供建造方法,方法的参数为建造类,方法里面调用建造类的两个抽象方法。
12、观察者模式
观察者模式又叫发布-订阅模式,定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。当一个对象的改变需要改变其它对象时,考虑使用观察者模式,观察者模式的工作就是解除耦合,让耦合的双方都依赖抽象。委托是一种引用方法的类型,一旦为委托分配了方法,委托与方法具有完全相同的行为。一个委托可以搭载多个方法,所有方法被依次唤起。委托对象所搭载的方法必须具有相同的原型和形式,也就是有相同的参数列表和返回值类型
13、状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。状态模式通过把各种状态转移逻辑分布到State的子类中,来减少相互间的依赖。
14、适配器模式
将一个类的接口转换成客户希望的另一个接口,适配器模式使原本由于接口不兼容不能一起工作的类可以一起工作。
15、备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
16、组合模式
将对象组合成树形结构以表示整体和部分的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
17、迭代器模式
提供一种方法顺序访问一个聚合对象中各个元素,而不是暴露该对象的内部表示。
18、桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立的变化。这并不是说让抽象类和派生类分离,而是指我们在实现系统的时候多角度的分类,每一种分类都有可能有变化,那么就把多角度分离出来去独立变化,减少之间的耦合。例如手机可以分为好多品牌,每种品牌又有不同的手机功能。手机可以定义为Abstraction类,不同品牌的手机可以定义为RedifinedAbstraction,然后还有一个实现类。
19、职责链模式
使多个对象都有机会处理请求,从而避免请求的发生者和接收者之间的耦合关系。将这些对象连成一个链,并沿着链传递请求,直到有一个对象处理。
20、访问者模式
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素新的操作。目的是要把处理从数据结构中分离出来。