策略模式
策略模式是定义一系列算法的方法,算法完成的都是相同的工作,只是具体的实现不同,它可以由相同的方法调用所有的算法,减少了各种算法和使用算法之间的耦合.
tips: Context类可以和工厂模式结合
单一设计原则
就一个类而言,应该仅有一个引起它变化的原因[ASD].如果一个类承担了过多的职责,就等于把这些职责耦合在一起,一个职责变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计.
开放封闭原则
是说:软件实体(类,模块,函数,等等)应该可以扩展,但是不可修改;对于扩展是开放的,对于修改是封闭的.
依赖倒转原则
- 高层模块不应该依赖低层模块。两者都应该依赖于抽象
- 抽象不应该依赖细节。细节应该依赖抽象
里氏代换原则
一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出子类对象和父类对象的区别。子类型必须能够替换掉他们的父类型.
迪米特法则(最少知识原则)
如果两个类不必直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用.
装饰模式
它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择的,按顺序的使用装饰功能包装对象了.
代理模式
为其他对象提供了一种代理以控制对这个对象的访问.
应用:远程代理,虚拟代理,安全代理,智能代理
工厂方法模式
简单工厂模式的最大优点就是在于工厂包含了必要的判断,根据客户端的选择条件动态实例化需要的对象,而工厂方法模式【定义了一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类延迟到其子类】
模板方法模式
定义一个操作的算法骨架,而将一些具体实现步骤延迟到子类;使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
外观模式
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个高层接口使得子系统更加容易使用。(完美的体现了依赖倒转原则和迪米特原则)
建造者模式
建造者模式是在当创建复杂对象的算法应该独立与该对象的组成部分以及他们的装配方法时适用的模式
tips:某个具体对象的装配方法应该独立与这个对象,创建一个Director指挥者类,用于指挥建造过程.
观察者模式
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生改变时,会通知自己知道的所有观察者,让他们能够自己更新自己。
抽象工厂模式
抽象工厂模式相比于工厂方法模式,区别不大
[提供一个创建一系列相关或相互依赖对象的接口]
状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
好处:将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
将特定状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易的增加新的状态和转换.
目的:消除庞大的条件分支语句.将各种状态转移到State的各个子类中
【当前状态有能力,有义务自动的转换为下一个状态】
适配器模式
使用一个已经存在的类,如果它的接口和要求不匹配,考虑使用适配器模式
备忘录模式
Memento模式适用于功能比较复杂,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分,Originator可以根据保存Memento信息还原到前一状态.
组合模式
将对象组合成树形结构以表示,部分整体的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
[组合模式就是让客户可以一致地使用组合结构和单个对象]
迭代器模式
不管这些对象是什么都需要遍历的时候,为遍历不同的聚集结构提供如开始,下一个,是否结束,当前哪一项等统一接口。
单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。让类自身负责保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法。
tips:双从检查锁在这里尽量避免使用,
桥接模式
实际系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少他们的耦合。
【手机有不同品牌,有不同的软件,不同的 通讯录,但是都可以理解错品牌的抽象,软件的抽象】[品牌 包含了不同软件]【从而将这种变化分离出来,使用继承的方式,这就是桥接模式,】【手机品牌有聚合了多个软件】【桥接】
命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
职责链模式
当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandle对象负责处理它。
接受者和发送者都没有对方的明切信息,链中的对象也并不知道链的结构。结果是职责链可简化对象的相互链接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选者的引用。
中介者模式
用一个中介对象来封装一系列的对象交互,中介者使各对像不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合。
亨元模式
运用共享技术有效地支持大量细粒度的对象。
避免大量相似的类的开销,如果能发现这些实例除了几个参数外基本都是相同的,那么可以再方法调用时将他们传递进来,就可以通过共享大幅度地减少单个实例的数目。
tips:亨元模式所共享的对象其内部状态一致,而随环境而变化,不可共享的状态就是外部状态,外部状态可以在方法调用时传递进去。
例子:棋子对象 的外部状态和内部状态,,,围棋中棋子的外部状态是棋子的相对位置,而内部状态则是棋子的颜射。
解释器模式
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
访问者模式
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。