:策略模式--Duck
原则:封装变化的部分;针对超类编程,不针对实现;多组合少继承;
#ifndef __DUCK_H__
#define __DUCK_H__
#include "FlyBehavior.h"
#include "QuackBehavior.h" class Duck
{
public:
Duck()
{ } virtual ~Duck()
{ } virtual void performFly()
{ } virtual void performQuack()
{ } void setQuack(QuackBehavior *t)
{
if (t != NULL)
{
quackBehavior = t;
}
} void setFly(FlyBehavior *t)
{
if (t != NULL)
{
flyBehavior = t;
}
} protected:
QuackBehavior *quackBehavior;
FlyBehavior *flyBehavior;
}; class MuDuck :public Duck
{
public:
MuDuck()
{
quackBehavior = new SqueakQuack();
flyBehavior = new FlyWithWings();
} virtual ~MuDuck()
{
delete quackBehavior;
delete flyBehavior;
} void performFly()
{
flyBehavior->fly();
} void performQuack()
{
quackBehavior->quack();
} };
#endif
#ifndef __QUACKBEHAVIOR_H__
#define __QUACKBEHAVIOR_H__
#include <iostream>
using namespace std; class QuackBehavior
{
public:
QuackBehavior()
{ } virtual void quack() = 0
{ }
}; class MuteQuack : public QuackBehavior
{
public:
MuteQuack()
{ } void quack()
{
cout << "Mute Quack" << endl;
}
}; class SqueakQuack :public QuackBehavior
{
public:
SqueakQuack()
{ } void quack()
{
cout << "Squeak Quack" << endl;
}
}; #endif
#ifndef __FLYBEHAVIOR_H__
#define __FLYBEHAVIOR_H__
#include <iostream>
using namespace std; class FlyBehavior
{
public:
FlyBehavior()
{ } virtual void fly() = 0 {}
}; class FlyWithWings : public FlyBehavior
{
public:
FlyWithWings(){}
void fly()
{
cout << "fly? Yes,I Can!" << endl;
}
}; class FlyNoWay : public FlyBehavior
{
public:
FlyNoWay(){}
void fly()
{
cout << "fly? No! " << endl;
}
}; class FlyRocket :public FlyBehavior
{
public:
FlyRocket()
{ }
void fly()
{
cout << "fly? With Rocket" << endl;
} }; #endif
客户端代码
#include <iostream>
#include "Duck.h"
using namespace std;
int main()
{
Duck *duck = new MuDuck();
duck->performFly();
duck->performQuack(); duck->setFly(new FlyRocket());
duck->performFly(); delete duck; return 0;
}
:策略模式--Duck的更多相关文章
- 《Head First 设计模式》之策略模式
作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5915202.html 模式名称 策略模式(Strategy Pattern) 需求 模拟鸭子游戏,游戏 ...
- [Head First设计模式]策略模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- Strategy - 策略模式
策略模式: 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.public interface FlyBehavior { public void fly() ...
- Head First设计模式之策略模式(Strategy Pattern)
前言: 刚刚开始学习设计模式,之前也接触过一些,但是从来都没有系统的学过,这次打算好好的学习一下.这里就当是对学习过程的一个记录.整理,以便可以在以后不时的温故知新. 这一节采用一个鸭子的示例,层层推 ...
- C++ 之 策略模式
1 会飞的鸭子 Duck 基类,包含两个成员函数 swim() 和 display():派生类 MallardDuck,RedheadDuck 和 RubberDuck,各自重写 display() ...
- Head First 设计模式--1策略模式 组合优于继承
策略模式:第一了算法族,分别封装起来,让他们之间可以互相替换,次模式让算法的变化独立于使用算法的客户. 首先看个错误的面向对象. 假如我们需要写一个关于鸭子的程序,各种类型的鸭子.第一想到的就是建一个 ...
- [一]Head First设计模式之【策略模式】(鸭子设计的优化历程)
public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck() { } ...
- PHP设计模式之策略模式
前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...
- HeadFirst设计模式之策略模式
什么是策略模式:它定义了一系列算法,可以根据不同的实现调用不同的算法 大多数的设计模式都是为了解决系统中变化部分的问题 一.OO基础 抽象.封装.多态.继承 二.OO原则 1.封装变化,如把FlyBe ...
随机推荐
- how-to-view-source-of-chrome-extension
https://gist.github.com/paulirish/78d6c1406c901be02c2d Option 1: Command-line download extension as ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格动态加载
jQuery EasyUI 树形菜单 - 树形网格动态加载 动态加载树形网格有助于从服务器上加载部分的行数据,避免加载大型数据的长时间等待.本教程将向您展示如何创建带有动态加载特性的树形网格(Tree ...
- java日志及异常错误信息输出的问题
1.异常信息可以层层传递,直到最后一层再输出日志也来得及 2.错误信息要在发生错误的当时就输出日志,否则到了其它层,很难得到准确的错误信息内容
- android -------- 错误Attribute application@allowBackup value=(true) from AndroidManifest.xml
开发中遇到一个问题,运行项目时,出现了一个这如下这样的问题 问题: Manifest merger failed : Attribute application@allowBackup value=( ...
- 55-56 ORM多表查询
多表查询: KEY ====> 通过ORM引擎如何跨表: 正向查询按字段,反向查询按表名小写 模型的创建: from django.db import models # Create yo ...
- linux 查看日志命令
linux中命令cat.more.less均可用来查看文件内容, 区别:cat是一次性显示整个文件的内容,还可以将多个文件连接起来显示,它常与重定向符号配合使用,适用于文件内容少的情况:more和le ...
- java把类似a=1&b=2&c=3的String类型数据转成map集合
public static Map<String, Object> transStringToMap(String mapString, String separator, String ...
- Navicat 的安装及破解
本地环境: ubutun 14 1.安装. ①先老实选择官方试用版安装(不推荐在各个下载平台去下载) 中文版:http://www.navicat.com.cn/download/navicat-fo ...
- 判断input[type=file]上传文件格式
input type="file" 在js中判断文件上传类型 function onSubmit(){ var form1 = document.forms[0]; var fil ...
- webpack打包vue文件报错,但是cnpm run dev正常,最后我只想说:是我太笨,还是webpack4.4版本太坑
最近做一个项目,需要使用webpack打包 .vue 文件的单页面应用,调试都正常,使用cnpm run dev 都可以,就是webpack打包时报错.如下: ERROR in ./src/App.v ...