策略模式
策略模式在我们编写算法时是非常重要的,它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。
示例:
#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
参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用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# 枚举类型