Solid 原则
单一职责
开闭原则: 一个软件系统的设计应当尽量做到对扩展开放,对修改关闭。达到这个原则的途径就是遵循"对变化的封装"的原则。这个原则讲的是在进行软件系统的设计时,应当设法找出一个软件系统中会变化的部分,将之封装起来。
里氏代换原则
接口隔离原则
依赖倒置原则
创建型设计模式解决的创建者和被创建对象的耦合问题;
结构型设计模式解决的是实体对象和实体对象的耦合问题;
行为型设计模式解决的是实体对象和行为操作之间的耦合问题。
创建型模式 5种
单件模式
抽象工厂
工厂方法
生成器模式
原型模式 实现ICloneable 借口
Singleton模式解决的是实体对象个数的问题。除了Singleton之外,其他创建型模式解决的都是new所带来的耦合关系。
Factory Method,Abstract Factory,Builder都需要一个额外的工厂类来负责实例化“易变对象”,而Prototype则是通过原型(一个特殊的工厂类)来克隆“易变对象”。
如果遇到“易变类”,起初的设计通常从Factory Method开始,当遇到更多的复杂变化时,再考虑重构为其他三种工厂模式(Abstract Factory,Builder,Prototype)。
结构型模式:7 种 对接口的处理
适配器模式 注重转换接口,将不吻合的接口适配对接(适合于旧系统),220 转110 adapter,类适配器和对象适配器
桥模式 注重分离接口(抽象)与其实现,支持多维度变化
装饰者 decorator 注重稳定接口的前提下为对象扩展功能。事后诸葛亮,动态添加删除方法。孙悟空变成鱼,鱼能在水里游,赋予新的功能。
组合模式 注重统一接口,将“一对多”的关系转化为“一对一”的关系。Composion 类似于树,从前有座山,山里有个庙,庙里有个和尚,在讲一个故事:从前有座山,山里…. 透明模式(根据接口)和安全模式
外观模式 façade 注重简化接口,简化组件系统与外部客户程序的依赖关系,多个接口组合成一个接口
代理模式 proxy 注重假借接口,增加间接层来实现灵活控制
享元模式 模式注重保留接口,在内部使用共享技术对对象存储进行优化 使用HashTable
行为型模式: 11种
•Chain of Resp.(责任链模式)A way of passing a request between a chain of objects注重封装对象责任,支持责任的变化。 在抽象类中构建next 指针,设置next 属性, 在实现中构建链 纯与不纯的责任连,一般是不纯
•Iterator(迭代子模式)Sequentially access the elements of a collection注重封装集合对象内部结构,支持集合的变化。实现借口IEnumerable 接口,返回IEnumerator的GetEnumerator()方法,可以用yield return 遍历实现 也可以依次实现IEnumerator接口中的三个方法
•Observer(观察者模式)A way of notifying change to a number of classes:注重封装对象通知,支持通信对象的变化。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。Subject 里面维护一个ArrayList 或者event, 通过动态添加Observer或者委托 关联起来,联动效应遍历arraylist, 然后ob.update()
•Strategy(策略模式)Encapsulates an algorithm inside a class :注重封装算法,支持算法的变化。类型中不携带状态信息,消除条件判断语句
Strategy模式注重于算法的封装,而Bridge模式注重于分离抽象和实现,为一个抽象体系提供不同的实现。Bridge模式与Strategy模式都很好的体现了"Favor composite over inheritance"的观点。组合优于继承
•Template Method(模版方法模式)Defer the exact steps of an algorithm to a subclass 封装算法结构,支持算法子步骤变化。 需要携带状态信息
Template Method方法:执行算法的步骤协议是本身放在抽象类里面的,允许一个通用的算法操作多个可能实现
Strategy模式:执行算法的协议是在具体类,每个具体实现有不同通用算法来做。
•Command(命令模式)Encapsulate a command request as an object注重将请求封装为对象,支持请求的变化
Command模式与C#中的Delegate(Delegate是把函数指针抽象成了为一种可被调用的行为对象)有些类似。但两者定义行为接口的规范有所区别:Command以面向对象中的“接口-实现”来定义行为接口规范,更严格,更符合抽象原则;Delegate以函数签名来定义行为接口规范,更灵活,但抽象能力比较弱。 主要目的是解耦行为请求者和行为实现者。C# 中有委托可以代替
•Interpreter(解释器模式)A way to include language elements in a program 注重封装特定领域变化,支持领域问题的频繁变化
只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则的问题”才适合使用Interpreter模式。
•Mediator(中介者模式)Defines simplified communication between classes, 注重封装对象间的交互,支持对象交互的变化。避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。
Facade模式是解耦系统外到系统内(单向)的对相关联关系
Mediator模式是解耦系统内各个对象之间(双向)的关联关系
•Memento(备忘录模式)Capture and restore an object's internal state 注重封装对象状态变化,支持状态保存/恢复。 回溯到对象之前处于某个点时的状态, 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态(如果没有这个关键点,其实深拷贝就可以解决问题)。可以用序列化反序列化保存
Memento模式与Command模式的异同
虽然两者都支持Undo操作,但是Command是对行为的封装,Memento是对对象状态的保留,这是目的上的不同。它们支持的也是Undo操作的不同层面,Command是对行为序列的操作,Memento是对行为状态的操作。
•State(状态模式)Alter an object's behavior when its state changes
State模式 注重封装与状态相关的行为,支持状态的变化。 将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。
•Visitor(访问者模式)Defines a new operation to a class without change注重封装对象操作变化,支持在运行时为类层次结构动态添加新的操作
Visitor模式通过所谓双重分发(double dispatch)来实现在不更改Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作。
所谓双重分发即Visitor模式中间包括了两个多态分发(注意其中的多态机制):第一个为accept方法的多态辨析;第二个为visit方法的多态辨析