:策略模式--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 ...
随机推荐
- Spring Boot入门第四天:使用Thymeleaf模板引擎
原文链接 关于Thymeleaf的优点,我只说一条:它就是html页面啊,直接可以用浏览器打开.受够了JSP的同学可以尝试一下. 1.在pom.xml文件中添加依赖: <!--<depen ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格惰性加载节点
jQuery EasyUI 树形菜单 - 树形网格惰性加载节点 有时我们已经得到充分的分层树形网格(TreeGrid)的数据. 我们还想让树形网格(TreeGrid)按层次惰性加载节点. 首先,只加载 ...
- 守护进程函数——内部的小范围try catch 增强了 while死循环执行的 可靠性
void Watch() { try { LogHelper.WriteLog("WatchServi ...
- javascript使用误区(switch、this)
1.switch 语句会使用恒等计算符(===)进行比较: 以下实例由于类型不一致不会执行 alert 弹窗: var x = "10"; switch(x) { case 10: ...
- python基础之lambda,sort,filter,map,递归函数的运用
内容梗概:1. lamda 匿名函数2. sorted()3. filter()4. map()5. 递归函数 1.lambda 形式: lambda 参数:返回值 f = lambda x,y: x ...
- Bipartite Segments CodeForces - 901C (区间二分图计数)
大意: 给定无向图, 无偶环, 每次询问求[l,r]区间内, 有多少子区间是二分图. 无偶环等价于奇环仙人掌森林, 可以直接tarjan求出所有环, 然后就可以预处理出每个点为右端点时的答案. 这样的 ...
- python记录_day14 内置函数二 迭代 二分法
一.匿名函数 形式: lambda 形参:返回值 lambda表示的是匿名函数. 不需要用def来声明, 一句话就可以声明出一个函数.匿名函数不是说一定没名字,而是他们的名字统一称为“lambda”, ...
- Spring boot(四)thymeleaf使用介绍
在上篇文章springboot(二):web综合开发中简单介绍了一下thymeleaf,这篇文章将更加全面详细的介绍thymeleaf的使用.thymeleaf 是新一代的模板引擎,在spring4. ...
- Activiti搭建
Activiti搭建 前期准备: JDK+Eclipse+Tomcat+Maven的安装与配置 参考:http://blog.csdn.net/zhshulin/article/details/307 ...
- 【IDEA】【8】上传已有项目到Git
问题:开发初期没有建立GIT仓库,开发一段时间后,需要将已有代码上传到Git 解决方案: 1,首先使用Git命令行 git clone XXXXX.git 将项目下载 2,拷贝下载下来的项目根目录下的 ...