设计模式


设计模式

设计模式

原则

总纲

  • 开闭原则:
    • 一个软件实体,如类,模块,函数应该对扩展开放,修改封闭

六大原则

  1. 单一职责原则
    • 一个类应该只有一个发生变化的原因
  2. 里氏替换原则
    • 所有使用基类的地方必须能透明的使用其子类对象
  3. 依赖倒置原则
    1. 上层模块不应依赖于底层模块,他们都应该依赖于抽象
    2. 抽象不应依赖于细节,细节应依赖于抽象
  4. 接口隔离原则
    1. 客户端不应该依赖于他不需要的接口
    2. 类间的依赖关系应该建立在最小的接口上
  5. 迪米特法则(最少知道原则)
    • 只与你的朋友交谈,不和陌生人说话
      • 出现为成员变量,方法参数,方法返回值的类为直接朋友
  6. 合成复用原则
    • 尽量使用对象的组合/聚合,而不是继承达到软件复用的目的
    • 疑问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);
}

FactoryCreatePrudct()ProductDescProduct11111111111Product22222222222

抽象工厂模式(AbstractFactory)

  • 以工厂模式为基础,进一步对工厂进行了抽象

AbstractFactoryCreate1()Create2()Factory1Create1()Create2()Factory2Create1()Create2()Product_1DescProduct_1_11111111111Product_1_22222222222Product_2DescProduct_2_11111111111Product_2_22222222222

单例模式(Singleton)

  • 一次创建多次使用,分为懒汉模式和饿汉模式

建造者模式(Builder)

  • 如同生产线一样,一个builder关注于产品的每一道工序通过修改每一道工序,实现输出产品的不同

FactoryGetCar()ColorRedYellowShapeBigSmallCarGetColor()GetShape()

原型模式(Prototype)

  • 通过Clone创建新数据进行使用,保证原有数据不被污染

结构型

适配器模式(Adapter)

  • 将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容的类可以一起工作

TargetOpt()AdapterOpt()AdapteeTryOpt()

装饰器模式(Decorator)

  • 动态给一个对象添加一些额外职责

MoveRunActDecoratorMove()Run()

代理模式(Proxy)

  • 为其他对象提供一种代理以控制对这个对象的访问

RealSubjectProxySubject

外观模式(Facade)

  • 为子系统中的一组接口提供一个一致的界面,使这个子系统更加容易使用

KTVLightDoorOpenKTVCloseKTVLightOnOffDoorOnOff

桥接模式(Bridge)

  • 将抽象部分与其实现部分分离,使它们可以独立变化

SoldierAction()ActionBridgeAction()MoveActionAction()AtkActionAction()

组合模式(Composite)

  • 将对象组合成树型结构,以表示“部分-整体”的层次结构,使用户对单个对象和组合对象的使用具有一致性,如Unity的Compoment

享元模式(FlyWeight)

  • 运用共享技术有效的支持大量细粒度的对象,对象池

行为型

策略模式(Stategy)

  • 定义一系列算法,把它们个个封装起来,并且使他们可以相互替换。此模式使得算法可以独立于使用他们的客户而变化

模板方法模式(Tamplate)

  • 定义一个操作中的算法骨架,而将一些步骤延迟到子类,使子类可以不改变一个算法的结构即可重新定义该算法(如模板类)

观察者模式(Observer)

  • 定义对象间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都得到通知并自动更新(事件与委托)

迭代子模式(Iterator)

  • 提供一种方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示

责任链模式(Chain of Responsibility)

  • 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止

命令模式(Command)

  • 将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作

备忘录模式(Memento)

  • 在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,这样以后就可以将对象恢复到原先保存的状态

状态模式(State)

  • 允许一个对象在其内部状态改变时改变它的行为。

访问者模式(Vistor)

  • 表示一个作用与某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素的新操作

中介者模式(Neduator)

  • 用一个中介对象来封装一系列对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互

解释器模式(Interpreter)

  • 给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子


已发布

分类

来自

标签: