C++ 设计模式(二)单例模式、策略模式、责任链模式和装饰器模式

设计模式

单例模式

懒汉模式

定义

  懒汉模式只有在调用是才会生成单例类,没有调用的时候是不会生成的,可以理解为它很懒,所以叫懒汉模式。

代码

template<typename T>
class Singleton {
public:
	 static T& GetInstance() {
	 	static T instance; // 这⾥要初始化DesignPattern,需要调⽤	DesignPattern 构造函数,同时会调⽤⽗类的构造函数。
	 	return instance;
	 }
protected:
	 virtual ~Singleton() {}
	 Singleton() {} // protected修饰构造函数,才能让别⼈继承
	 Singleton(const Singleton&) {}
	 Singleton& operator =(const Singleton&) {}
};

// 可以用子类继承Singleton来扩展单例类
class DesignPattern : public Singleton<DesignPattern> {
	 friend class Singleton<DesignPattern>; // friend 能让 Singleton<T> 访问到 DesignPattern构造函数
private:
	 DesignPattern(){}
	 DesignPattern(const DesignPattern&) {}
	 DesignPattern& operator=(const DesignPattern&) {}
}

策略模式

定义

  定义⼀系列算法,把它们⼀个个封装起来,并且使它们可互相替换。该模式使得算法可独⽴于使⽤它的客户程序⽽变化。

背景

  某商场节假⽇有固定促销活动,为了加⼤促销⼒度,现提升国庆节促销活动规格;

要点

  1、策略模式提供了⼀系列可重⽤的算法,从⽽可以使得类型在运⾏时⽅便地根据需要在各个算法
之间进⾏切换;
  2、策略模式消除了条件判断语句;就是在解耦合;
  3、充分体现了开闭原则;单⼀职责;

本质

  分离算法,选择实现;

结构图

C++ 设计模式(二)单例模式、策略模式、责任链模式和装饰器模式

责任链模式

定义

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

背景

  请假流程,1天内需要主程序批准,3天内需要项⽬经理批准,3天以上需要⽼板批准;

要点

  解耦请求⽅和处理⽅,请求⽅不知道请求是如何被处理,处理⽅的组成是由相互独⽴的⼦处理构成,⼦处理流程通过链表的⽅式连接,⼦处理请求可以按任意顺序组合;
  责任链请求强调请求最终由⼀个⼦处理流程处理;通过了各个⼦处理条件判断;
  责任链扩展就是功能链,功能链强调的是,⼀个请求依次经由功能链中的⼦处理流程处理;
  充分体现了单⼀职责原则;将职责以及职责顺序运⾏进⾏抽象,那么职责变化可以任意扩展,同时职责顺序也可以任意扩展;

本质

分离职责,动态组合;

结构图

C++ 设计模式(二)单例模式、策略模式、责任链模式和装饰器模式

装饰器模式

定义

  动态地给⼀个对象增加⼀些额外的职责。就增加功能⽽⾔,装饰器模式⽐⽣成⼦类更为灵活。

背景

  普通员⼯有销售奖⾦,累计奖⾦,部⻔经理除此之外还有团队奖⾦;后⾯可能会添加环⽐增⻓奖⾦,同时可能针对不同的职位产⽣不同的奖⾦组合;
C++ 设计模式(二)单例模式、策略模式、责任链模式和装饰器模式

要点

  通过采⽤组合⽽⾮继承的⼿法, 装饰器模式实现了在运⾏时动态扩展对象功能的能⼒,⽽且可以根据需要扩展多个功能。 避免了使⽤继承带来的“灵活性差”和“多⼦类衍⽣问题”。
  不是解决“多⼦类衍⽣的多继承”问题,⽽是解决“⽗类在多个⽅向上的扩展功能”问题;
  装饰器模式把⼀系列复杂的功能分散到每个装饰器当中,⼀般⼀个装饰器只实现⼀个功能,实现复⽤装饰器的功能;

本质

动态组合

结构图

C++ 设计模式(二)单例模式、策略模式、责任链模式和装饰器模式

责任链和装饰器的区别:

责任链是选择,装饰器是叠加。

上一篇:设计模式——单例模式


下一篇:单例模式双重锁,懒汉饿汉,还有冒泡排序,小白必备技能