Head First设计模式C++实现-Strategy模式

本文详细介绍了策略模式的概念及其应用,通过鸭子的行为实例展示了如何通过不同的策略实现行为的灵活变化,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:

定义了算法族,分别封装起来,让它们之间可以互相替换,以此模式让算法的变化独立于使用算法的客户。

UML图:

UML-Strategy

代码实现:

/************************************************************************/ /* Strategy.h */ /************************************************************************/ /** * @file Strategy.h * @brief Strategy模式的实现代码 * @author wlq_729@163.com * http://blog.youkuaiyun.com/rabbit729 * @version 1.0 * @date 2009-02-23 */ #ifndef STRATEGY_H_ #define STRATEGY_H_ #include <string> using std::string; class IQuackBehavior { public: virtual string Quacking() = 0; }; class IFlyBehavior { public: virtual string Fly() = 0; }; class MuteQuack : public IQuackBehavior { public: string Quacking(); }; class Quack : public IQuackBehavior { public: string Quacking(); }; class Squeak : public IQuackBehavior { public: string Quacking(); }; class FlyNoWay : public IFlyBehavior { public: string Fly(); }; class FlyRocketPowered : public IFlyBehavior { public: string Fly(); }; class FlyWithWings : public IFlyBehavior { public: string Fly(); }; class Duck { protected: IFlyBehavior* flyBehavior; IQuackBehavior* quackBehavior; public: void SetFly(IFlyBehavior* flyBehavior); void SetQuack(IQuackBehavior* quackBehavior); virtual string Display() = 0; string PerformFly(); string PerformQuack(); string Swim(); }; class MallardDuck : public Duck { public: MallardDuck(); string Display(); }; class ModelDuck : public Duck { public: ModelDuck(); string Display(); }; class RubberDuck : public Duck { public: RubberDuck(); string Display(); }; #endif /************************************************************************/ /* Strategy.cpp */ /************************************************************************/ /** * @file Strategy.cpp * @brief Strategy模式的实现代码 * @author wlq_729@163.com * http://blog.youkuaiyun.com/rabbit729 * @version 1.0 * @date 2009-02-23 */ #include "Strategy.h" string MuteQuack::Quacking() { return "silence"; } string Quack::Quacking() { return "Quack"; } string Squeak::Quacking() { return "Squeak"; } string FlyNoWay::Fly() { return "I can't fly."; } string FlyRocketPowered::Fly() { return "I'm flying with a rocket!"; } string FlyWithWings::Fly() { return "I'm flying!!"; } void Duck::SetFly(IFlyBehavior *flyBehavior) { this->flyBehavior = flyBehavior; } void Duck::SetQuack(IQuackBehavior* quackBehavior) { this->quackBehavior = quackBehavior; } string Duck::PerformFly() { return flyBehavior->Fly(); } string Duck::PerformQuack() { return quackBehavior->Quacking(); } string Duck::Swim() { return "All ducks float, even decoys!"; } MallardDuck::MallardDuck() { quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } string MallardDuck::Display() { return "I'm a real Mallard duck"; } ModelDuck::ModelDuck() { quackBehavior = new Quack(); flyBehavior = new FlyNoWay(); } string ModelDuck::Display() { return "I'm a model duck"; } RubberDuck::RubberDuck() { quackBehavior = new Squeak(); flyBehavior = new FlyNoWay(); } string RubberDuck::Display() { return "I'm a rubber duck"; } /************************************************************************/ /* test.cpp */ /************************************************************************/ /** * @file test.cpp * @brief Strategy模式的实现代码 * @author wlq_729@163.com * http://blog.youkuaiyun.com/rabbit729 * @version 1.0 * @date 2009-02-23 */ #include "Strategy.h" #include <iostream> using namespace std; void main(void) { Duck* duck = new MallardDuck(); cout<<duck->PerformQuack()<<endl; cout<<duck->PerformFly()<<endl; duck->SetFly(new FlyRocketPowered()); cout<<duck->PerformFly()<<endl; }

程序输出:

Quack
I'm flying!!
I'm flying with a rocket!
请按任意键继续. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值