设计模式:策略模式(C++)【诸葛亮的锦囊妙计】

序言

今天带领大家一起来学习下策略模式,看到策略二字,就让笔者想到了谋略,想到了三国,那个谋士如云、英雄辈出的年代。遥想公瑾当年,小乔初嫁了,雄姿英发。咳咳,扯回来。我们所说的策略 ,从字面意思就是一个好的办法,对应我们编程来说就是一个好的方法 而且这个方法得站在一个高度,从编程的整体的角度要做到解耦合可扩展,我想用什么策略就用什么策略 ,下次我又想到了好策略还不会更改现有的代码这就是策略模式。没懂?请继续....

策略模式场景化

我们拿刘备江东就亲的事 说起,诸葛亮给赵云 3条锦囊妙计(也就3个策略),让赵云在合适的时候打开 然后按照策略行事

这个3条 妙计 有直接 告诉子龙吗当然没有,不然就不灵了(面向接口编程,让客户知道的越少越好)。这些妙计是不是都是策略,是不是应该实现同一个策略接口每个不同的妙计或者说策略(算法) 都有不同的实现,这样也更有扩展 后序再添加 策略只需要实现接口就行了。

那么我们再来看看赵云(策略使用者),赵云使用策略不需要知道 这个策略 诸葛亮是如何想出来这个妙计他只管打开妙计 按计而行 就可以,那么赵云 只需要拥有 一个策略接口的实例 就可以了。如果 诸葛亮下次 又有了新的妙计,赵云依旧可以 使用新的策略。因为是面向接口编程嘛。

策略模式代码

前面啰嗦那么多,策略模式总的来说 就是 将算法进行封装,并且面向接口编程。策略使用者 包含策略接口 ,设置好策略,然后可以使用策略了。直接看代码吧,代码很简单 主要是 这种封装 和 面向接口编程的思想 一定要领悟

#define _CRT_SECURE_NO_WARNINGS
#include 
using namespace std;

//策略接口,抽象类
//所有妙计的基类,具体策略 自己实现去。
class Strategy
{
public:
	virtual void doSomeThing() = 0;//纯虚函数
};

//具体的策略,具体的实现算法
//诸葛亮的锦囊妙计
//第一条妙计
class StrategyFirst:public Strategy
{
	void doSomeThing()
	{
		cout << "一、拜见乔国老,并把刘备娶亲的事情搞得东吴人尽皆知" ;
	}
};

//第二条妙计
class StrategySecond :public Strategy
{
	void doSomeThing()
	{
		cout << "二、用谎言(曹操打荆州)骗泡在温柔乡里的刘备回去" ;
	}
};

//第三条妙计
class StrategyThird :public Strategy
{
	void doSomeThing()
	{
		cout << "三、让孙夫人摆平东吴的追兵,她是孙权妹妹,东吴将领惧她三分" ;
	}
};

//策略上下文,也就是使用策略的环境
//赵云拆锦囊
class StategyContext
{
public:
	//使用策略(执行具体的算法)
	//赵云拆锦囊
	void useStrategy()
	{
		cout << "赵云打开锦囊->";
		this->strategy->doSomeThing();
		cout << "->赵云关闭锦囊" << endl;
		return;
	}
	//设定 策略
	void setStrategy(Strategy* strategy)
	{
		this->strategy = strategy;
	}
private:
	Strategy* strategy;
};

int main(int argc, char *argv[])
{
	StategyContext zhaoYun;//赵云
	StrategyFirst first;//第一条妙计
	StrategySecond second;//第二条妙计
	StrategyThird third;//第三条妙计

	//设定具体策略,然后使用策略
	zhaoYun.setStrategy(&first);
	zhaoYun.useStrategy();
	zhaoYun.setStrategy(&second);
	zhaoYun.useStrategy();
	zhaoYun.setStrategy(&third);
	zhaoYun.useStrategy();

	return EXIT_SUCCESS;
}


运行结果

设计模式:策略模式(C++)【诸葛亮的锦囊妙计】_第1张图片

你可能感兴趣的:(【设计模式】,【Language_C++】,设计模式(C++版))