学习设计模式心得
目的:为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
设计原则:
1, 开闭原则:对扩展开放,对修改关闭。
比如:抽取出共同的特征作为父类,避免修改父类,不同之处生成子类,子类用来扩展。
2, 里氏代换原则:如果调用的是父类的话,那么换成子类也完全可以运行。
3, 依赖倒转原则:针对接口编程,不是针对实现编程。
4, 最小知识原则:不要和陌生人说话。
5, 接口隔离原则:每一个接口应该是一种角色,不多不少,不干不该干的事,该干的事都要干。
解释:少用继承,多用合成关系来实现;把波动限制在尽量小的范围。
基本模式:
1, 创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
2, 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
3, 行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。
理解:
1, 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
父类:工厂 子类:北方工厂
父类:蔬菜 子类:番茄
父类:水果 子类:苹果
2, 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
(1)抽象化(Abstraction)角色:
抽象化给出的定义,并保存一个对实现化对象的引用。
(2)修正抽象化(Refined Abstraction)角色:
扩展抽象化角色,改变和修正父类对抽象化的定义。
(3)实现化(Implementor)角色:
这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
(4)具体实现化(Concrete Implementor)角色:
这个角色给出实现化角色接口的具体实现。
3, 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
4, 命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
5, 组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
6, 装饰模式:动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类方式更为灵活。
(1)抽象构件(Component)角色:
给出一个抽象接口,以规范准备接收附加责任的对象。
(2)具体构件(Concrete Component)角色:
定义一个将要接收附加责任的类。
(3)装饰(Decorator)角色:
持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
(4)具体装饰(Concrete Decorator)角色:
负责给构件对象"贴上"附加的责任。
7, 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
8, 代理模式:为其他对象提供一个代理以控制对这个对象的访问。
9, 观察者模式:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
10, 职责链模式:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
11, 适配器模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
12, 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
13, 外观模式:定义了一个高层接口,该接口为子系统中的一组接口提供一个一致的界面,使得这一子系统更加容易使用。
14, 访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
1) Visitor 抽象访问者角色:
为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
2) ConcreteVisitor.具体访问者角色:
实现Visitor声明的接口。
3) Element :
定义一个接受访问操作(accept()),它以一个访问者(Visitor)作为参数。
4) ConcreteElement 具体元素:
实现了抽象元素(Element)所定义的接受操作接口。
5) ObjectStructure 结构对象角色:
这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。