[toc]
策略模式
定义:策略模式定义了算法族,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
鸭子类设计
#include "vector"#include "iostream"#include "algorithm"using namespace std;// 定义飞行行为抽象类class FlyBehavior{public:virtual void fly(){};};// 飞行行为特化class FlyWithWinds: public FlyBehavior{public:void fly() override {cout<<" i am flying "<<endl;}};class FlyNoWay: public FlyBehavior{void fly() override {cout<<" i can't fly "<<endl;}};class FlyRocket: public FlyBehavior{void fly() override {cout<<" i can fly like a rocket "<<endl;}};// 叫声行为class QuackBehavior{public:virtual void quack(){}};class Quack: public QuackBehavior{void quack() override {cout<<" i can bark bark "<<endl;}};class MeteQuack: public QuackBehavior{void quack() override {cout<<"<< Silence >>"<<endl;}};// 所有鸭子基类class Duck{public:FlyBehavior *flyBehavior{};QuackBehavior *quackBehavior{};virtual void display(){};void performFly() const{flyBehavior->fly();}void performQuack() const{quackBehavior->quack();}static void swim(){cout<<"all ducks can swim..."<<endl;}// 用于动态改变行为void setBehavior(FlyBehavior *fb){flyBehavior=fb;}};// 模型鸭子class ModelDuck: public Duck{public:ModelDuck(){flyBehavior=new FlyNoWay();quackBehavior=new Quack();}void display() override {cout<<"i am a model duck"<<endl;}};class MallarDuck: public Duck{public:MallarDuck(){quackBehavior=new Quack();flyBehavior=new FlyWithWinds();}void display() override {cout<<" i am a MallarDuck.. "<<endl;}};int main() {cout<<"hello world CLion"<<endl;Duck *model=new ModelDuck();// 调用performFly 该行为被委托给flyBehavior对象,该对象实例为FlyNoWaymodel->performFly();model->setBehavior(new FlyRocket()); // 运行时改变行为model->performFly();return 0;}
