博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++实现】HeadFirst策略模式设计模式
阅读量:7123 次
发布时间:2019-06-28

本文共 2113 字,大约阅读时间需要 7 分钟。

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

Head First设计模式中介绍策略模式时以Duck类作为样例。当中用flyBehavior和quackBehavior两个接口引用变量代表鸭子飞行和鸭子叫这两种行为,通过改变flyBehavior和quackBehavior来满足不同的Duck子类的不同行为。这样带来的优点就是能够在执行时改变Duck子类的行为。以下是我用C++改写的代码。

//MyDuck.h#ifndef MYDUCK_INCLUDED#define MYDUCK_INCLUDED//在这里我用抽象类取代原文中的接口class FlyBehavior{	public:		virtual void fly()=0;};class QuackBehavior{	public:		virtual void quack()=0;};class FlyWithWings:public FlyBehavior{	public:		void fly();};class FlyNoWay:public FlyBehavior{	public:		void fly();};class FlyRocketPowerd:public FlyBehavior{	public:		void fly();};class Quack:public QuackBehavior{	public:		void quack();};class Squeak:public QuackBehavior{	public:		void quack();};class MuteQuack:public QuackBehavior{	public:		void quack();};class Duck{	public:		Duck();		void swim();		virtual void display()=0;		void performQuack();		void performFly();		void setQuackBehavior(QuackBehavior *newBehavior);		void setFlyBehavior(FlyBehavior *newBehavior);	//在这里我用基类指针取代原文中的接口引用变量	protected:		FlyBehavior *flyBehavior;		QuackBehavior *quackBehavior;};class MallardDuck:public Duck{	public:		virtual void display();		MallardDuck();};#endif // MYDUCK_INCLUDED
MyDuck.cpp#include "MyDuck"#include 
using std::cout;using std::endl;//定义行为类void FlyWithWings::fly(){ cout<<"I'm flying with wings!!"<
quack();}void Duck::performFly(){ flyBehavior->fly();}void Duck::setFlyBehavior(FlyBehavior *newBehavior){ flyBehavior=newBehavior;}void Duck::setQuackBehavior(QuackBehavior *newBehavior){ quackBehavior=newBehavior;}Duck::Duck(){}//定义MallardDuck类的成员方法void MallardDuck::display(){ cout<<"I'm MallardDuck!!!"<
//MyDuckMain.cpp#include "MyDuck"int main(){	Duck *mallard=new MallardDuck;	mallard->display();	mallard->performFly();	mallard->performQuack();	mallard->swim();	mallard->setFlyBehavior(new FlyNoWay);	mallard->performFly();	mallard->setFlyBehavior(new FlyRocketPowerd);	mallard->performFly();	return 0;}

执行结果为:

I'm MallardDuck!!!

I'm flying with wings!!
Quack!!!
I'm swimming!!!
I can't fly5555!!
I'm flying with a ROCKET!!

相关链接:

版权声明:本文博客原创文章,博客,未经同意,不得转载。

你可能感兴趣的文章
CS224n笔记9 机器翻译和高级LSTM及GRU
查看>>
KVM虚拟机
查看>>
GdiPlus[57]: 图像(九) IGPBitmap 特有的属性与方法
查看>>
Windows 多媒体函数(winmm.dll 中的函数)汇总
查看>>
关于 Delphi 中流的使用(4) 遍历读取流中的所有数据
查看>>
使用 IntraWeb (4) - 页面布局之 TIWRegion
查看>>
域控的升级及客户端加入域
查看>>
【Java每日一题】20161129
查看>>
[译文]greenlet:轻量级并发程序
查看>>
五分钟学会HTML
查看>>
请求Servlet 得到 Request 里所有对象
查看>>
volatile 和 synchronized 的比较
查看>>
Java递归
查看>>
windows 操作系统原版下载地址
查看>>
剑指offer——O(1)时间删除单链表节点
查看>>
OSPF在企业网络中的应用
查看>>
什么是NIO(转载)
查看>>
第五课 SCCM2012通过OSD功能实现操作系统部署(上)
查看>>
易宝典文章——用ISA 2006标准版发布Exchange 2010的OWA系列之生成Exchange证书申请文件...
查看>>
shell 读取键盘输入
查看>>