一、定义
策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
二、使用场景
客户需要很多种鸭子。
要求:
1.每种鸭子都要会游泳。
2.每种鸭子有叫和飞的行为。
3.鸭子的叫和飞的行为可以在使用时动态的设置。
思考:有绿头鸭、红头鸭、橡皮鸭、木头鸭。。。可能有N多种鸭子,我们如何设计,来满足上面的要求呢?
三、客户使用代码实现
我们可能封装了18个飞的算法、22个叫的算法,每种类型的算法之间可以相互替换而不影响其他的功能。如上,可以随便改鸭子的飞和叫的行为(算法)。这是策略模式牛逼之处。
四、具体实现
1)项目结构
2)鸭子飞的行为(算法)相关
FlyBehavior.h
1 #pragma once 2 #include <iostream> 3 class FlyBehavior 4 { 5 public: 6 virtual void fly()=0; 7 };
FlyNoWay.h
#pragma once #include "FlyBehavior.h" class FlyNoWay : public FlyBehavior { void fly() override; };
FlyNoWay.cpp
#include "FlyNoWay.h" void FlyNoWay::fly() { std::cout << "不会飞!" << std::endl; }
FlyRocketPowered.h
#pragma once #include "FlyBehavior.h" class FlyRocketPowered : public FlyBehavior { void fly() override; };
FlyRocketPowered.cpp
#include "FlyRocketPowered.h" void FlyRocketPowered::fly() { std::cout << "用火箭动力飞!" << std::endl; }
FlyWithWings.h
#pragma once #include "FlyBehavior.h" class FlyWithWings : public FlyBehavior { void fly() override; };
FlyWithWings.cpp
#include "FlyWithWings.h" void FlyWithWings::fly() { std::cout << "用翅膀飞!" << std::endl; }
3)鸭子叫的行为(算法)相关
QuackBehavior.h
#pragma once #include <iostream> class QuackBehavior { public: virtual void quack()=0; };