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

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策略模式设计模式的更多相关文章

  1. 策略模式设计模式(Strategy)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将 ...

  2. HeadFirst设计模式之策略模式

    什么是策略模式:它定义了一系列算法,可以根据不同的实现调用不同的算法 大多数的设计模式都是为了解决系统中变化部分的问题 一.OO基础 抽象.封装.多态.继承 二.OO原则 1.封装变化,如把FlyBe ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]

     1  2{<HeadFirst设计模式>之策略模式 }  3{ 本单元中的类为策略类           }  4{ 编译工具: Delphi7.0           }  5{ E- ...

  4. 【HeadFirst 设计模式总结】1.策略模式

    1.书中举了一个鸭子类的设计,有些会飞或者会叫,有些不会飞可能也不会叫,用继承则导致不该有的功能通过继承而继承了下来,使用接口则代码无法做到最大程度的重用.进而引出设计原则1:找出应用中可能需要变化之 ...

  5. headfirst设计模式(1)—策略模式

    什么是策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化(摘自百度百科) 关键字:算法封装,相互替换,独立变化 算法封装 ...

  6. 读headFirst设计模式 - 策略模式

    有些人已经解决你的问题了 什么是设计模式?我们为什么要使用设计模式?怎样使用?按照书上的说法和我自己的理解,我认为是这样的:我们遇到的问题其他开发人员也遇到过,他们利用他们的智慧和经验将问题解决了,把 ...

  7. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

  8. HeadFirst设计模式读书笔记之策略模式

    1. 例子 1. 做一个鸭子模拟器,里面有很多不同的鸭子,有的可以游泳,有的可以睡觉,有的可以呱呱叫,一般套路是定义一个鸭子的超类,在 超类里定义睡觉,游泳,呱呱叫的方法,再让不同的鸭子子类继承这个超 ...

  9. 策略模式(headfirst设计模式学习笔记)

    鸭子的行为被封装 进入一组类中,能够轻易的扩展和改变.假设须要能够执行时改变行为! 策略模式定义了算法族.分别封装起来.让他们能够相互替换,此模式让算法的变化独立于使用算法的客户. 继承,相似之处用继 ...

随机推荐

  1. poj 2182 Lost Cows(段树精英赛的冠军)

    主题链接:http://poj.org/problem? id=2182 Lost Cows Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  2. java提高篇(六)-----关键字static

    一. static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概念,在Java中static表示"全局"或 ...

  3. C# WebBrowser.DocumentCompleted 多次调用解决方法

    大概出现了以下几种情况. 1.WebBrowser载入一个页面后DocumentCompleted事件会执行两次,但这两次的ReadyState状态不一样,分别是Intercative和Complet ...

  4. POJ 3076 Sudoku DLX精确覆盖

    DLX精确覆盖模具称号..... Sudoku Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 4416   Accepte ...

  5. Android Tween Animation

    View Animation, 它显示在view向上Tween Animation Tween动画.本质上没有变化View对象本身.只要改变它绘制 实施方式有两种.一个xml定义,直接在代码中的定义 ...

  6. 使用jQuery和css3实现了仿淘宝ued博客左边的菜单切换动画

    今天看到淘宝ued博客的左侧导航菜单的动画好,要使用jQuery和css3我做一个简单的示例,主要用途是实现jQuery 事件和css3 transition属性. 个元素来实现鼠标滑动到某个导航的背 ...

  7. Makefile 中:= ?= += =的差别 和条件运行

    一:在Makefile中常常看到obj-m    := scull.o和KERNELDIR ?= /lib/modules/等不同的赋值方式,如今总结他们的差别: = 是最主要的赋值 := 是覆盖之前 ...

  8. struts详细解释拦截器

    1.拦截器:Struts2拦截器将一个Action要么Action的方法.之前或截取后场,和Struts2拦截器是可插拔,拦截器AOP一种实现. WebWork:拦截器是动态拦截Action调用的对象 ...

  9. Visual Studio 2015使用EF6的ModelFirst模式添加实体数据模型缺少tt文件问题

    在看实体框架 (EF) 入门的时候,当按照样例做到ModelFirst的时候出问题了 这是使用vs2015新建的实体数据模型 这是官网样例 对比样例截图,会发现里面缺少.tt的文件.最重要的是最终代码 ...

  10. DBA工具——DMV——通过sys.dm_exec_procedure_stats查看存储过程执行信息

    原文:DBA工具--DMV--通过sys.dm_exec_procedure_stats查看存储过程执行信息 对于DBA来说,经常要手机存储过程的某些信息: 执行了多少次 执行的执行计划如何 执行的平 ...