设计模式
原则
总纲
- 开闭原则:
- 一个软件实体,如类,模块,函数应该对扩展开放,修改封闭
六大原则
- 单一职责原则
- 一个类应该只有一个发生变化的原因
- 里氏替换原则
- 所有使用基类的地方必须能透明的使用其子类对象
- 依赖倒置原则
- 上层模块不应依赖于底层模块,他们都应该依赖于抽象
- 抽象不应依赖于细节,细节应依赖于抽象
- 接口隔离原则
- 客户端不应该依赖于他不需要的接口
- 类间的依赖关系应该建立在最小的接口上
- 迪米特法则(最少知道原则)
- 只与你的朋友交谈,不和陌生人说话
- 出现为成员变量,方法参数,方法返回值的类为直接朋友
- 只与你的朋友交谈,不和陌生人说话
- 合成复用原则
- 尽量使用对象的组合/聚合,而不是继承达到软件复用的目的
- 疑问1:使用继承实现多态是否违背合成复用原则
合成复用原则的重要性
通常类的复用分为继承复用和合成复用两种,继承复用虽然有简单和易实现的优点,但它也存在以下缺点。
1).继承复用破坏了类的封装性。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。
2).子类与父类的耦合度高。父类的实现的任何改变都会导致子类的实现发生变化,这不利于类的扩展与维护。
3).它限制了复用的灵活性。从父类继承而来的实现是静态的,在编译时已经定义,所以在运行时不可能发生变化。
采用组合或聚合复用时,可以将已有对象纳入新对象中,使之成为新对象的一部分,新对象可以调用已有对象的功能,它有以下优点。
1).它维持了类的封装性。因为成分对象的内部细节是新对象看不见的,所以这种复用又称为“黑箱”复用。
2).新旧类之间的耦合度低。这种复用所需的依赖较少,新对象存取成分对象的唯一方法是通过成分对象的接口。
3).复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。
————————————————
版权声明:本文为CSDN博主「闲人不梦卿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/atu1111/article/details/105360942`
创建型
工厂模式(Factory)
- 通过继承产品的基类,来实现产品的多态,通过封装工厂的产品创建函数来实现制造的唯一接口
- 存在的问题:只能生成继承于Product的产品,当要生成不同类型的产品时相形见绌
enum EM_ProductType
{
Product1,
Product2,
};
class Product
{
};
class Product1:public Product
{
};
class Product2:public Product
{
};
class Factory
{
Product* CreateProduct(EM_ProductType eType)
{
switch(eType)
{
case Product1:
return new Product1();
case Product2:
return new Product2();
}
}
};
int main(int argc,char** argv)
{
Factory factory;
Product* pro1 = factory.CreateProduct(Product1);
Product* pro2 = factory.CreateProduct(Product2);
}
抽象工厂模式(AbstractFactory)
- 以工厂模式为基础,进一步对工厂进行了抽象
单例模式(Singleton)
- 一次创建多次使用,分为懒汉模式和饿汉模式
建造者模式(Builder)
- 如同生产线一样,一个builder关注于产品的每一道工序通过修改每一道工序,实现输出产品的不同
原型模式(Prototype)
- 通过Clone创建新数据进行使用,保证原有数据不被污染
结构型
适配器模式(Adapter)
- 将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容的类可以一起工作
装饰器模式(Decorator)
- 动态给一个对象添加一些额外职责
代理模式(Proxy)
- 为其他对象提供一种代理以控制对这个对象的访问
外观模式(Facade)
- 为子系统中的一组接口提供一个一致的界面,使这个子系统更加容易使用
桥接模式(Bridge)
- 将抽象部分与其实现部分分离,使它们可以独立变化
组合模式(Composite)
- 将对象组合成树型结构,以表示“部分-整体”的层次结构,使用户对单个对象和组合对象的使用具有一致性,如Unity的Compoment
享元模式(FlyWeight)
- 运用共享技术有效的支持大量细粒度的对象,对象池
行为型
策略模式(Stategy)
- 定义一系列算法,把它们个个封装起来,并且使他们可以相互替换。此模式使得算法可以独立于使用他们的客户而变化
模板方法模式(Tamplate)
- 定义一个操作中的算法骨架,而将一些步骤延迟到子类,使子类可以不改变一个算法的结构即可重新定义该算法(如模板类)
观察者模式(Observer)
- 定义对象间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都得到通知并自动更新(事件与委托)
迭代子模式(Iterator)
- 提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示
责任链模式(Chain of Responsibility)
- 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
命令模式(Command)
- 将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作
备忘录模式(Memento)
- 在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,这样以后就可以将对象恢复到原先保存的状态
状态模式(State)
- 允许一个对象在其内部状态改变时改变它的行为。
访问者模式(Vistor)
- 表示一个作用与某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素的新操作
中介者模式(Neduator)
- 用一个中介对象来封装一系列对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
解释器模式(Interpreter)
- 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子