策略模式

策略模式在我们编写算法时是非常重要的,它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。

示例:

#include <iostream>

//飞行行为,用抽象类表示   strategy 抽象策略类
class FlyBehavior
{
public:
    virtual ~FlyBehavior() {};
    virtual void fly() = 0;
};

//叫声行为,用抽象类表示 strategy 抽象策略类
class QuackBehavior
{
public:
    virtual ~QuackBehavior() {};
    virtual void quack() = 0;
};


/* ConcreteStrategy 具体策略类 strategy 接口实现的具体算法。*/

//实现飞行行为的方法类
class FlyWithWings : public FlyBehavior
{
public:
    void fly() {
        std::cout << ("I'm flying!!") << std::endl;
    }
};

class FlyNoWay : public FlyBehavior {
public:
    void fly() {
        std::cout << ("I can't fly") << std::endl;
    }
};

//实现叫声行为的类
class Quack : public QuackBehavior
{
public:
    void quack() {
        std::cout << ("Quack") << std::endl;
    }
};

class MuteQuack : public QuackBehavior
{
public:
    void quack() {
        std::cout << ("<< Slience >>") << std::endl;
    }
};

class Squeak : public QuackBehavior
{
public:
    void quack() {
        std::cout << "Squeak" << std::endl;
    }
};


// 鸭子基类,有display,performFly, performQuack,swim等方法。 
// context 上下文  具体使用策略的对象
class Duck
{
public:
    Duck(FlyBehavior*p_FlyBehavior, QuackBehavior* p_QuackBehavior)
    {
        pFlyBehavior = p_FlyBehavior;
        pQuackBehavior = p_QuackBehavior;
    }
    virtual ~Duck() {};
    virtual void display() {};
    void performFly()
    {
        pFlyBehavior->fly();
    }
    void performQuack()
    {
        pQuackBehavior->quack();
    }
    void swim()
    {
        std::cout << ("All ducks float, even decoys!") << std::endl;
    }
private:
    FlyBehavior* pFlyBehavior;
    QuackBehavior* pQuackBehavior;
};

//绿头鸭类       
class MallardDuck : public Duck
{
public:
    MallardDuck(FlyBehavior*fly_behavior = new FlyWithWings(),
        QuackBehavior*quack_behavior = new Quack())
        :Duck(fly_behavior, quack_behavior) {}

    void display()
    {
        std::cout << "I'm a real Mallard duck" << std::endl;
    }
};

int main()
{
    Duck* mallard = new MallardDuck();
    mallard->performFly();
    mallard->performQuack();
    delete mallard; mallard = nullptr;

    getchar();
    return 0;
}

输出:

I'm flying!!
Quack




参考:

https://www.guyuehome.com/38464

posted @   double64  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2021-09-17 C# StopWatch 简单使用
2021-09-17 C# 读写配置文件
2021-09-17 C# 匿名方法 和 lambda 表达式
2021-09-17 C# 数组的声明和初始化
2021-09-17 C# 关于继承和多态
2021-09-17 C# switch 语句
2021-09-17 C# 枚举类型
点击右上角即可分享
微信分享提示