设计模式之策略模式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++实现的主要内容,如果未能解决你的问题,请参考以下文章