设计模式总结一

过去我已经介绍了9种设计模式,下面对过往介绍的设计模式做一个复盘,力求用简洁的话描述每一设计模式并会给出模式结构。

设计模式

  • 组件协作:
  1. 设计模式之模板方法模式(Template Method)
  2. 设计模式之策略模式(Strategy)
  3. 设计模式之观察者模式(Observer)
  • 单一职责:
  1. 设计模式之装饰模式(Decorator)
  2. 设计模式之桥模式(Bridge)
  • 对象创建:
  1. 设计模式之工厂模式(Factor Method)
  2. 设计模式之抽象工厂模式(Abstract Factory)
  3. 设计模式之抽象原型模式(Prototype)
  4. 设计模式之Builder(建造者、构造者)模式

总结

1.Template Method

解决的是做某件事情步骤1 2 3 4...固定,但是某几步可能依情况不同的场景。
在这里插入图片描述
简易代码如下:

class AbstructClass
{
   
public:
	void TemplateMethod()
	{
   
		step1();

		if (step2())
			PrimitiveOperation1();

		step3();

		for (int i = 0; i < 3; i++){
   
			PrimitiveOperation2();
		}

		step4();
	};
protected:
	void step1(){
   }
	bool step2(){
    return true; }
	void step3(){
   }
	void step4(){
   }

	/*以后由子类覆写,决定具体的动作*/
	virtual void PrimitiveOperation1() = 0;
	virtual void PrimitiveOperation2() = 0;
	/*以后由子类覆写,决定具体的动作*/
};


/*以后根据需要覆写虚方法,由使用者决定*/
class ConcreteClass : public AbstructClass	
{
   
protected:
	virtual void PrimitiveOperation1(){
    cout << "PrimitiveOperation1" << endl; };
	virtual void PrimitiveOperation2(){
    cout << "PrimitiveOperation2" << endl; };
};

这里的 TemplateMethod() 方法一定是稳定的,不变的
每次Client使用只需自己定义一个 ConcreteClass 类即可。

详见:设计模式之模板方法模式(Template Method)

2.Strategy

解决的是 if else 选择的有关问题,比如今天的业务要使用策略1 ,可能明天用策略2。

在这里插入图片描述
简易代码如下:

class Strategy
{
   
public:
	virtual void AlgorithmInterface() = 0;
};

class Context
{
   
private:
	Strategy* strategy;

public:
	Context(Strategy* _strategy) 
		: strategy(_strategy){
   }

	void setStrategy(Strategy* _strategy) {
    strategy = _strategy; }

	void ContextInterface()
	{
   
		//...
		strategy->AlgorithmInterface();
		//...
	}
};

class ConcreteStrategyA : public Strategy
{
   
public:
	virtual void AlgorithmInterface(){
    std::cout << "ConcreteStrategyA " << std::endl; }
};
class ConcreteStrategyB : public Strategy
{
   
public:
	virtual void AlgorithmInterface(){
    std::cout << "ConcreteStrategyB " << std::endl; }
};
//...其他具体策略

这样以后Client就可以根据自己的需要扩展自己的算法。

详见:设计模式之策略模式(Strategy)

3.Observer

解决的场景是事件触发类问题被观察者一旦有变化,要通知观察者,更新。

比如:

  • 微信公众号,如果一个用户订阅了某个公众号,那么便会收到公众号发来的消息,那么,公众号就是『被观察者』,而用户就是『观察者』
  • 气象站可以将每天预测到的温度、湿度、气压等以公告的形式发布给各种第三方网站,如果天气数据有更新,要能够实时的通知给第三方,这里的气象局就是『被观察者』,第三方网站就是『观察者』
  • MVC模式中的模型与视图的关系也属于观察与被观察

在这里插入图片描述
代码如下:

Observer.h

#pragma once

#include<iostream>
#include"Subject.h"

class Subject;
class Observer
{
   
public:
	Observer();
	~Observer();
	virtual void Update(Subject* sub) = 0;
};

Subject.h

#pragma once

#include<iostream>
#include"Observer.h"
#include<list>
class Observer;

class Subject
{
   
public:
	Subject();
	~Subject();
	
	/*所有ConcreteSubject都有这3种方法,再父类实现,声明成虚函数则可以让ConcreteSubject以后可以修改这3种方法*/
	virtual void attach(Observer* observer);
	virtual void 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值