原则:封装变化的部分;针对超类编程,不针对实现;多组合少继承;

#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的更多相关文章

  1. 《Head First 设计模式》之策略模式

    作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5915202.html 模式名称 策略模式(Strategy Pattern) 需求 模拟鸭子游戏,游戏 ...

  2. [Head First设计模式]策略模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  3. Strategy - 策略模式

    策略模式: 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.public interface FlyBehavior { public void fly() ...

  4. Head First设计模式之策略模式(Strategy Pattern)

    前言: 刚刚开始学习设计模式,之前也接触过一些,但是从来都没有系统的学过,这次打算好好的学习一下.这里就当是对学习过程的一个记录.整理,以便可以在以后不时的温故知新. 这一节采用一个鸭子的示例,层层推 ...

  5. C++ 之 策略模式

    1  会飞的鸭子 Duck 基类,包含两个成员函数 swim() 和 display():派生类 MallardDuck,RedheadDuck 和 RubberDuck,各自重写 display() ...

  6. Head First 设计模式--1策略模式 组合优于继承

    策略模式:第一了算法族,分别封装起来,让他们之间可以互相替换,次模式让算法的变化独立于使用算法的客户. 首先看个错误的面向对象. 假如我们需要写一个关于鸭子的程序,各种类型的鸭子.第一想到的就是建一个 ...

  7. [一]Head First设计模式之【策略模式】(鸭子设计的优化历程)

    public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck() { } ...

  8. PHP设计模式之策略模式

    前提: 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查 找.排序等,一种常用的方法是硬编码(Hard Cod ...

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

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

随机推荐

  1. 使用pymysql操作数据库

    学习如何使用python的pymysql模块来操作mysql数据库 这里的基本用法主要借鉴了该篇博客:https://www.cnblogs.com/woider/p/5926744.html 因为这 ...

  2. Mongodb 分享(一)

    Mongodb使用基础知识: 一.简介 1.mongodb是什么? 1)MongoDB 是一个基于分布式文件存储的数据库.由 )mongodb 客户端:NoSQL Manager for MongoD ...

  3. 放弃 Tightvnc, 选择 Tigervnc

    构建headless vnc server ,我终于放弃了Tightvnc 基于以下原因: 1) 已知的Qt5的键盘映射问题,导致virtualbox 的使用出现困难 https://unix.sta ...

  4. linux常用命令及系统常见符号

    常用命令 1.start x 进入界面 2.shutdown -h now 立刻关机 shutdown -r now 立刻重新启动 reboot 立刻重新启动 3.su root 切换成超级管理员 4 ...

  5. 详细讲解Linux下安装python3(Python3.5.4)

    https://jingyan.baidu.com/article/6b97984dd6dbb01ca2b0bf0a.html

  6. G.711是一种由国际电信联盟(ITU-T)制定的音频编码方式

    http://zh.wikipedia.org/zh-cn/G.711 ITU-T G.711 page ITU-T G.191 software tools for speech and audio ...

  7. OSPF - 1,基础

    1,OSPF知识点a)在OSPF中,如果是环回口宣告进OSPF,不管宣告时配置的是多少位掩码,路由器收到的都是32位.(EIGRP配了多少位就收到多少位).好处:EIGRP中,在PING包发起时如果在 ...

  8. 【Linux】linux常用查看命令

    查看磁盘大小的命令df .du df -h 查看整台服务器的硬盘使用情况 du -sh * 查看每个文件夹的大小 ps -ef 查看所有进程 top 实时显示进程状态用户 free -m 查看内存使用 ...

  9. LeetCode--258--各位相加*

    问题描述: 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 ...

  10. sgu

    dp第几朵花放第几瓶 104 数论 能不能除3:105    106(ex_gcd引入t求范围交)     107(大数乘的FFT) 开空间技巧108 棋盘黑白格消除109(组合数学) java平方根 ...