设计模式主要原则
单一职责原则(Single Responsibility Principle)
实现类要职责单一
里氏替换原则(Liskov Substitution Principle)
不要破坏继承关系
依赖倒置原则(Dependence Inversion Principle)
面向接口编程
接口隔离原则(Interface Segregation Principle)
设计接口时要精简单一,提供尽可能小的单独接口
迪米特法则(Law Of Demeter)
最少知识原则,尽量少的发生相互作用
开闭原则(Open Closed Principle)
可扩展,但不可修改
合成复用原则(Composite Reuse Principle)
优先组合或聚合,其次才是考虑继承
设计模式
一、创建型模式(Creational)5种
关注对象的创建过程,对类的实例化过程进行抽象,描述如何将对象的创建和使用分离。
1、工厂方法模式(Factory Method)
定义了一个用于创建对象的接口,让类的实例化延迟到子类中实现
抽象产品------具体产品
抽象工厂------具体工厂
主要优点:
要添加新的产品时,无需修改抽象工厂和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,只要添加一个具体工厂和具体产品即可,从而提高系统的可扩展性(开闭原则)
2、抽象工厂模式(Abstract Factory)
定义一系列相关或相互依赖创建对象的接口,而无需指定具体的类
抽象产品------具体产品
抽象工厂------具体工厂
主要优点:
当有多于一个的产品族时,可以动态的改变产品族,也可以方便增加新的产品族
3、单例模式(Singleton)
确保一个类只有一个实例,并提供一个全局访问点来访问
主要优点:
提供唯一实例的受控访问
4、建造者模式(Builder)
将一个复杂对象的构建与它的表示分离,在客户不知道对象的建造过程和细节的情况下就可以直接创建复杂的对象
产品
抽象建造者------具体建造者
客户
主要优点:
建造者模式负责按顺序创建复杂对象,隐藏内部的建造过程和细节
代码复用性和封装性
5、原型模式(Prototype)
通过复制原型来创建新的对象
抽象原型------具体原则
客户
主要优点:
简化对象的创建过程
可以通过深克隆的方式保存对象的状态,以便在需要的时候使用
二、结构型模式(Structural)7种
1、桥接模式(Bridge)
将抽象与实现分离,使它们可以独立变化(用聚合关系代替继承关系来实现,抽象层聚合)
抽象对象------扩展抽象对象
抽象实现化------具体实现化
主要优点:
抽象类和实现类之间增加更多的灵活性
解决继承或多层次继承导致系统类数量剧增的问题
2、适配器模式(Adapter)
将一个类的接口转换成另一个接口,让本来接口不兼容的类能够一起使用
适配器模式分为类结构型模式和对象结构型模式
目标接口
适配类
适配器类(转换器)
主要优点:
客户可以透明调用目标接口
复用了现存代码
3、装饰模式(Decorator)
动态地给对方增加一些职责,也就是增加额外功能
抽象对象------具体对象
抽象装饰对象------具体装饰对象
主要优点
扩展方式比采用继承方法更加灵活
主要应用场景
现有类被隐藏或终极类或继承方式繁琐
一些基本功能排列组合而产生很多功能
动态添加或动态撤销新能力
4、组合模式(Composite)
又叫部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示"部分-整体"的关系,使客户对单个对象和组合对象具有一致的访问性
主要优点:
对单个对象和组合对象有一致性的处理
容易在组体内加入新对象
5、享元模式(Flyweight)
运用共享技术来有效的支持大量细粒度对象的复用
享元模式两种状态:
内部状态:不会随环境变化的可共享部分
外部状态:随环境变化的不可共享部分
抽象享元------具体享元
非享元
享元工厂
主要优点:
相同对象只要保存一份,这降低了系统中对象的数量,从而降低了系统中细粒度对象给内存带来的压力(存在大量相同或相似的对象时使用此模式才会带来好处)
6、外观模式(Facade)
为多个复杂的子系统提供一个一致的接口,使这些子系统能够更容易被访问
抽象外观------外观
子系统
客户
主要优点:
降低了客户与子系统之间的耦合度
屏蔽子系统组件,使用更容易
7、代理模式(Proxy)
为某对象提供一种代理以控制对象的访问(限制、增强或修改该对象的一些特征)
抽象产品类------具体产品类
代理类
客户类
主要优点:
将客户和目标对象分离,以控制对象的访问
主要应用场景:
远程代理
虚拟代理
安全代理
智能指引
延迟加载
三、行为型模式(Behavioral)11种
1、模板模式(Template)
一个抽象类定义了算法的通用框架,子类继承实现具体算法
主要优点:
易于修改或扩展那些被复用的实现
2、策略模式(Strategy)
将算法封装到一个类里面,通过组合的方式将具体算法的实现在组合对象中实现
主要优点:
不知道对象内部细节也可以复用
依赖性小
可以在运行期间动态定义实现
3、状态模式(State)
在不同的状态下会有不同表现,而一个状态又会在不同的表现下转移到下一个不同的状态(状态机FSM)
主要优点:
将状态逻辑和动作实现进行分离
4、观察者模式(Observer)
也称为发布-订阅模式,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
5、备忘录模式(Memento)
又叫快照模式,是要在不破坏封装行的前提下,捕获并保存一个类的内部状态,这样就可以利用该保存的状态实施恢复操作
6、中介者模式(Mediator)
提供将对象间的交互和通讯封装在一个类中,各个对象间的通信不用显示声明和引用,大大降低了系统的复杂性能
主要优点:
集中控制,便于管理
7、命令模式(Command)
将请求封装到一个对象 中,并将请求激活交给具体的处理对象操作,实现调用操作的对象和操作的具体实现者之间的解耦
8、访问者模式(Visitor)
将变更封装到一个类中,并由待更改类提供一个接收接口,这样访问者对象就可以处理元素对象上的操作
主要优点:
可以使得对象元素在不修改自己的同时增加新的操作
9、责任链模式(Chain Of Responsibility)
将可能处理一个请求的对象链接成一个链,并将请求在这个链上传递,直到有对象处理该请求
主要优点
极大地降低了系统的耦合性
10、迭代器模式(Iterator)
用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个类中进行,这样避免暴露该对象的内部表示
11、解释器模式(Interpreter)
使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过这个解释器来解释语言中的句子
主要优点:
可以提供了一种很好的组织和设计解析器的框架
使用类来表示文法规则,因此可以很容易实现文法的扩展