大话设计模式之学习笔记:目的是写出 易维护 易扩展 易复用 灵活多样的代码。
1.简单工厂模式:由工厂类返回具有同一父类的实例对象
2.策略模式:封装可供重用的算法或行为,由Context去决定具体采用的方法
3.单一职责原则:一个类的职责要明确,在类的职责分离上多思考
4 开放-封闭原则:尽量不改变初始的代码,将变化用抽象隔离出来,要求初始的时候对变化要想全面,减少无用的抽象。
5 依赖倒转原则:针对接口和抽象编程,所有程序依赖都是终止于抽象类或者接口。
6 装饰模式:为原有功能动态地添加更多功能的一种方式,把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,执行时,按顺序地使用装饰功能包装对象。 base.decorate().
7 代理模式:为其他对象提供一个代理,以控制对这个对象的访问。 proxy就是真实对象的代表,可以和对象继承相同的接口,proxy的接口实现调用的是真实对象的实现
8 工厂方法模式:是简单工厂模式的进一步抽象和推广,保持了优点,克服了修改工厂原来代码的缺点,不违背开放封闭原则,只是每次增加一个类后还需要增加相应工厂类。
9 原型模式:克隆Clone(),减少大量的初始化构造过程,深复制(数据),浅复制(引用)
10 模板方法模式: 提供了一个很好的代码复用平台,将公用的方法提取到抽象父类,将顶级逻辑骨架提取出来,不同的实现推迟到子类中实现
11 迪米特法则:也叫最少知识原则,在类的结构设计上,每个类都应该尽量降低成员的访问权限。也就是包装好自己的private,强调了类之间的松耦合。如果两个类不必彼此通信,那么就不应当发生直接的相互作用,如果一个类需要调用另一个类的某个方法,可以通过第三者转发这个调用。
12 外观模式:Facade 作为各种方法的使用者,为一组接口提供一个一致的界面,买基金代替买股票! 提供简单的接口,使用而不改变原始接口,降低复杂的系统的维护难度。
13 建造者模式:生成器模式,将复杂对象的构建和它的表示分离。 Director Builder
14 观察者模式:当一个对象的改变需要同时改变其他多个对象的时候用到
15 抽象工厂模式:提供一个创建一系列相关的依赖对象的接口,无需指定具体的类,子类继承后必须都实现父类的抽象方法。
16 状态模式:将与特定相关的行为局部化,并且将不同状态的行为分割开来,说白了就是消除庞大的条件分支(大的分支会使得代码难以修改、维护和扩展)。当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,考虑使用状态模式,抽象父类State,抽象方法Handle,子类在handle中相互转化,ConcreteState维护一个State的实例。
17 适配器模式:将一个类的接口缓存客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。相当与一个翻译的功能。例:电源适配器。 在双方都不容易修改的时候使用适配器适配,而客户端代码调用的是同一个接口。 维护一个要适配的对象实例,由适配器来执行工作。
18 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象回复到原先保存的状态。 用在功能比较复杂的,但需要记录属性历史的类,或者需要保存的属性只是众多属性中的一小部分时。
19 组合模式:整体和部分可以被一致对待。将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。部分继承自整体
20 迭代器模式:提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。为遍历不同的聚集结构提供如开始,下一个,是否结束,当前哪一个等统一的接口。(实用价值已经不如学习价值,因为各个语言基本已经实现)如java的 foreach in。
21 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。在new之前先判断是不是已new过了。定义静态类GetInstance,允许客户访问唯一实例。
class Singleton
{ //单线程 例
private static Singleton instance;
private Singleton(){}
private static Singleton GetInstance()
{
if(instance == null)instance = new Singleton();
return instance;
}
}
多线程的程序中会有可能创建多个实例,这时可以给进程一把锁来解决。lock是确保一个线程位于代码的临界区时,另一个线程不进入临界区,排队等待锁对象被释放。
双重锁定:
GetInstance(){
if (instance == null){
lock();
if(instance == null){ //第二层判断:防止同时进入第一层判断的第二个线程继续创建实例
instance = new Singleton()
}
}
}
22 桥接模式:手机软件统一。实现系统可能有多角度分类,每一种分类都可能变化,那么就把这种多角度分离出来让它们独立变化,减少耦合。
23 命令模式: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
相当于Command类 ————>具体的执行者类
24 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。好处是简化了请求之间的耦合。(每个接收者都维护一个下一级接收者的实例变量)
25 中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显式地相互引用,从而使耦合松散,而且可以独立地改变它们间的交互。 Mediator
26 享元模式:运用共享技术有效地支持大量细粒度的对象。如JAVA中的字符串如果内容相同,指向同一个内存地址。