【C++实现】HeadFirst策略模式设计模式
策略模式定义了算法家族。分别封装起来。让它们之间能够相互替换,此模式让算法的变化独立于使用算法的客户。
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 <iostream>
using std::cout;
using std::endl;
//定义行为类
void FlyWithWings::fly(){
cout<<"I'm flying with wings!!"<<endl;
}
void FlyNoWay::fly(){
cout<<"I can't fly5555!!"<<endl;
}
void FlyRocketPowerd::fly(){
cout<<"I'm flying with a ROCKET!!"<<endl;
}
void Quack::quack(){
cout<<"Quack!!!"<<endl;
}
void Squeak::quack(){
cout<<"Squeak!!!"<<endl;
}
void MuteQuack::quack(){
cout<<"MuteQuack!!!"<<endl;
}
//定义Duck类的成员方法
void Duck::swim(){
cout<<"I'm swimming!!!"<<endl;
}
void Duck::performQuack(){
quackBehavior->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!!!"<<endl;
}
MallardDuck::MallardDuck(){
flyBehavior=new FlyWithWings;
quackBehavior=new Quack;
}
//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!!
相关链接:http://blog.csdn.net/zhangzijiejiayou/article/details/27306819
版权声明:本文博客原创文章,博客,未经同意,不得转载。
【C++实现】HeadFirst策略模式设计模式的更多相关文章
- 策略模式设计模式(Strategy)摘录
23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将 ...
- HeadFirst设计模式之策略模式
什么是策略模式:它定义了一系列算法,可以根据不同的实现调用不同的算法 大多数的设计模式都是为了解决系统中变化部分的问题 一.OO基础 抽象.封装.多态.继承 二.OO原则 1.封装变化,如把FlyBe ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]
1 2{<HeadFirst设计模式>之策略模式 } 3{ 本单元中的类为策略类 } 4{ 编译工具: Delphi7.0 } 5{ E- ...
- 【HeadFirst 设计模式总结】1.策略模式
1.书中举了一个鸭子类的设计,有些会飞或者会叫,有些不会飞可能也不会叫,用继承则导致不该有的功能通过继承而继承了下来,使用接口则代码无法做到最大程度的重用.进而引出设计原则1:找出应用中可能需要变化之 ...
- headfirst设计模式(1)—策略模式
什么是策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化(摘自百度百科) 关键字:算法封装,相互替换,独立变化 算法封装 ...
- 读headFirst设计模式 - 策略模式
有些人已经解决你的问题了 什么是设计模式?我们为什么要使用设计模式?怎样使用?按照书上的说法和我自己的理解,我认为是这样的:我们遇到的问题其他开发人员也遇到过,他们利用他们的智慧和经验将问题解决了,把 ...
- HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)
策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...
- HeadFirst设计模式读书笔记之策略模式
1. 例子 1. 做一个鸭子模拟器,里面有很多不同的鸭子,有的可以游泳,有的可以睡觉,有的可以呱呱叫,一般套路是定义一个鸭子的超类,在 超类里定义睡觉,游泳,呱呱叫的方法,再让不同的鸭子子类继承这个超 ...
- 策略模式(headfirst设计模式学习笔记)
鸭子的行为被封装 进入一组类中,能够轻易的扩展和改变.假设须要能够执行时改变行为! 策略模式定义了算法族.分别封装起来.让他们能够相互替换,此模式让算法的变化独立于使用算法的客户. 继承,相似之处用继 ...
随机推荐
- poj 2182 Lost Cows(段树精英赛的冠军)
主题链接:http://poj.org/problem? id=2182 Lost Cows Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- java提高篇(六)-----关键字static
一. static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概念,在Java中static表示"全局"或 ...
- C# WebBrowser.DocumentCompleted 多次调用解决方法
大概出现了以下几种情况. 1.WebBrowser载入一个页面后DocumentCompleted事件会执行两次,但这两次的ReadyState状态不一样,分别是Intercative和Complet ...
- POJ 3076 Sudoku DLX精确覆盖
DLX精确覆盖模具称号..... Sudoku Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 4416 Accepte ...
- Android Tween Animation
View Animation, 它显示在view向上Tween Animation Tween动画.本质上没有变化View对象本身.只要改变它绘制 实施方式有两种.一个xml定义,直接在代码中的定义 ...
- 使用jQuery和css3实现了仿淘宝ued博客左边的菜单切换动画
今天看到淘宝ued博客的左侧导航菜单的动画好,要使用jQuery和css3我做一个简单的示例,主要用途是实现jQuery 事件和css3 transition属性. 个元素来实现鼠标滑动到某个导航的背 ...
- Makefile 中:= ?= += =的差别 和条件运行
一:在Makefile中常常看到obj-m := scull.o和KERNELDIR ?= /lib/modules/等不同的赋值方式,如今总结他们的差别: = 是最主要的赋值 := 是覆盖之前 ...
- struts详细解释拦截器
1.拦截器:Struts2拦截器将一个Action要么Action的方法.之前或截取后场,和Struts2拦截器是可插拔,拦截器AOP一种实现. WebWork:拦截器是动态拦截Action调用的对象 ...
- Visual Studio 2015使用EF6的ModelFirst模式添加实体数据模型缺少tt文件问题
在看实体框架 (EF) 入门的时候,当按照样例做到ModelFirst的时候出问题了 这是使用vs2015新建的实体数据模型 这是官网样例 对比样例截图,会发现里面缺少.tt的文件.最重要的是最终代码 ...
- DBA工具——DMV——通过sys.dm_exec_procedure_stats查看存储过程执行信息
原文:DBA工具--DMV--通过sys.dm_exec_procedure_stats查看存储过程执行信息 对于DBA来说,经常要手机存储过程的某些信息: 执行了多少次 执行的执行计划如何 执行的平 ...