目录
过去我已经介绍了9种设计模式,下面对过往介绍的设计模式做一个复盘,力求用简洁的话描述每一设计模式并会给出模式结构。
设计模式
- 组件协作:
- 单一职责:
- 对象创建:
- 设计模式之工厂模式(Factor Method)
- 设计模式之抽象工厂模式(Abstract Factory)
- 设计模式之抽象原型模式(Prototype)
- 设计模式之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就可以根据自己的需要扩展自己的算法。
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