设计模式速查
原则
1. 单一职责原则(Single Responsibility Principle):一个类只做它该做的事情
2. 里氏替换原则(Liskov Substitution Principle):所有可以放父类的地方都可以用子类代替
3. 依赖倒置原则(Dependence Inversion Principle):高层模块不应该依赖低层模块,两者都应该依赖其抽象。细节应该依赖抽象。
4. 接口隔离原则(Interface Segregation Principle):客户端不应该依赖他不需要的接口,一个类对另一个类的依赖应该建立在最小的接口上
5. 迪米特法则(Law Of Demeter):一个对象对其他对象应保持最少的了解
6. 开闭原则(Open Close Principle):软件应该对修改关闭,对扩展开放
7. 合成复用原则(Composite Reuse Principle):应该尽可能用组合和聚合关系,尽量少使用继承关系
创建型
1. Factory Method(工厂方法):由内部组装好指定的对象,通常把一类相关的类型归类到一个工厂方法中。实例化具体对象
2. Abstract Factory(抽象工厂):对工厂方法进行约束,构造通用的工厂。譬如用数据库工厂产生Sqlserver工厂
3. Builder(建造者):对于对象构造过程比较统一的对象封装构造过程。【将一个复杂对象的构建与他的表示分离,使得同样构建过程可以创建不同表示】
4. Prototype(原型):clone原来的对象,不用重新构造
5. Singleton(单例):全局唯一的对象
结构型
6. Adapter Class/Object(适配器):【使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。】对使用者来讲,有个可用的功能类似的库需要继承进来,接口不同所以加一层转换封装差异。称为适配器
7. Bridge(桥接):【将抽象部分与他的实现部分分离,是他们都可以独立地变化。】两个以上系列都会陆续发生变化和扩展,所以两个系列之间通过外部/其中一个引用另一个的父类/接口来达到复合的效果。
8. Composite(组合):对上提供统一接口,对下可以把此类接口无限扩展,譬如自定义控件实质上对上层还是调用控件,对下层来讲它是N个子控件的组合。【将对象组合成树形结构以表示“部分-整体”的层次结构。】
9. Decorator(装饰):在原来类做的事情上面包裹一层自定义的操作,对原有类增加操作or更改。譬如,对每个操作包裹一层日志装饰器python里的 @logger
10. Facade(外观):对外调用时,外部需要知道太多细节,用一个类把这些太多的细节封装起来,对外保留简单好用的接口。譬如SDK,封装了原来的底层接口。
11. Flyweight(享元):对象和对象之间大部分内容都相同,为减小开销,把不同部分抽离出来,把相同的部分设成共享,称为享元模式。【运用共享技术有效地支持大量细粒度对象】
12. Proxy(代理):对用户透明,代替原来类做一样的事情,对原有类操作限制或者更改方法。譬如,远程代理、虚代理、保护代理、智能指针。
行为型
13. Interpreter(解释器):【给定一种语言/上下文,定义它的文法,并定义一个解释器,使用解释器来解释表达语言中的句子。】
14. Template Method(模板方给定法):【给定一个操作中的算法骨架,将一些细节的实现保留到子类中实现。】
15. Chain of Responsibility(责任链):对一个请求,一层一层顺序处理,一层一层反向返回的描述。【使多个对象都有机会处理请求,从而避免年请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。】。譬如fliter
16. Command(命令):【将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。】
17. Iterator(迭代器):对于一个集合,一种对内部全体元素一一遍历的抽象方法。
18. Mediator(中介者):多对多的对象关系,中介者作为其中中间对象,大大减少对象的复杂度。不过在应用中介者模式前,要考虑是不是系统设计错误。【用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。】
19. Memento(备忘录):描述对象导出自己的内部数据,并能导入数据到自己内部以恢复当时导出的状态。
20. Observer(观察者):当一个对象改变需要同时改变其他对象,同时它又不知道有多少需要被改变。常用观察者、委托、事件。观察者提供通知其他对象的接口。【定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。】
21. State(状态):封装了各个状态变换,通过定义状态以及事件驱动状态的变化。缺点在于状态多则难于管理,优化方案是,层次分开,大层次有自己的状态,小层次有自己的状态。【允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。一个操作中含有庞大的多分支条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常有多个操作包含这一相同的条件结构。State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。】
22. Strategy(策略):核心在于封装操作,数据对象应用各个不同的策略对自己处理。【定义一系列的算法,把他们一个个封装起来,并且使他们可相互替换。本模式使得算法可以独立于使用它的客户而变化。】
23. Visitor(访问者):核心在于双向调用,Vister通过管理类路由,把不同的受管理的对象对应放于Vistor对应方法内,再由管理类统一执行。这样实际Vistor执行时就能获得对应收管理类管理的对象的数据。不过由于依赖倒转问题,Vistor对于管理类内部数据非常固定的场合才有用。