策略模式C++实现
Posted 今天也要努力搬砖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式C++实现相关的知识,希望对你有一定的参考价值。
参考书籍《Head First设计模式》
设计模式和设计原则
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
策略模式采用的设计原则:
1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
2、针对接口编程,而不是针对实现编程
3、多用组合少用继承
策略模式中的类
提到策略模式,常常会看到类似于下面的图。下图中包含了策略模式中用到的类,其中Stategy策略抽象类,定义了算法的接口(下面案例中的FlyBehavior和QuackBehavior是策略抽象类)。ConcreteStrategy具体策略类,实现具体算法(下面案例中的FlyWithWings、FlyWitNoWay、Quack、MuteQuack是具体策略类)。Context上下文类,拥有一个策略类引用,通过引用不同具体策略类,实现不同策略(下面案例中的Duck是上下文类)。
案列描述
希望鸭子的飞行和叫的行为动态变化。
代码实现
声明:类的声明和实现在同一个文件里是个坏习惯,坏习惯,坏习惯,但因为我懒,还是写一起了,大家不要效仿,要引以为戒,要引以为戒,要引以为戒。
针对设计原则1,该案例中会变化的部分是飞和叫。那么将飞和叫分别设计成两个抽象类。
然后针对不同的飞行行为设计不同的子类继承自“飞”这个类,飞行为的类代码如下
class FlyBehavior
public:
virtual void fly() = 0;
;
class FlyWithWings :public FlyBehavior
public:
void fly()
std::cout << "I am flying!" << std::endl;
;
class FlyWitNoWay :public FlyBehavior
public:
void fly()
std::cout << "I can't fly!"<<std::endl;
;
再针对不同的叫的行为设计不同的子类继承自“叫”这个类,叫行为代码实现如下
class QuackBehavior
public:
virtual void quack() = 0;
;
class Quack :public QuackBehavior
void quack()
std::cout << "Quack!" << std::endl;
;
class MuteQuack
void quack()
std::cout << "Slience!" << std::endl;
;
鸭子类中应该有行为类的两个指针,然后在实现行为的接口performFly()和performQuack()中通过指针调用行为接口。另外还需要一个setFlyBehavior和setQuackBehavior方法动态的设定行为。
具体代码实现如下
class Duck
public:
Duck()
//构造中两个指针设置为Nullptr
m_flyBehavior = nullptr;
m_quackBehavior = nullptr;
~Duck()
//析构中释放
delete m_flyBehavior;
delete m_quackBehavior;
void performFly()
m_flyBehavior->fly();
void performQuack()
m_quackBehavior->quack();
void setFlyBehavior(FlyBehavior* flyBehavior)
delete m_flyBehavior;
m_flyBehavior = flyBehavior;
void setQuackBehavior(QuackBehavior* quackBehavior)
//防止内存泄漏
delete m_quackBehavior;
m_quackBehavior = quackBehavior;
private:
FlyBehavior* m_flyBehavior;
QuackBehavior* m_quackBehavior;
;
最后实例化Duck类,动态改变其行为,进行测试,代码如下
void main()
Duck* duck = new Duck();
//一开始设置鸭子会飞会叫
duck->setFlyBehavior(new FlyWithWings());
duck->setQuackBehavior(new Quack());
//执行策略
duck->performFly();
duck->performQuack();
//改变鸭子的行为
duck->setFlyBehavior(new FlyWitNoWay());
duck->setQuackBehavior(new MuteQuack());
//再次执行策略
duck->performFly();
duck->performQuack();
system("pause");
执行结果
以上是关于策略模式C++实现的主要内容,如果未能解决你的问题,请参考以下文章