// test01.cpp : Defines the entry point for the console application.
//
//第一章,设计模式入门,策略模式
#include "stdafx.h"
#include "test01.h"

class FlyBehavior{
public:
    virtual void fly(){};
};

class FlyWithWings:public FlyBehavior{
public:

void fly(){
        printf("i'm flying!!\n");
    }
};

class FlyNoWay : public FlyBehavior
{
public:
    void fly(){
        printf("i can't fly!\n");
    }
};

class QuackBehavior {
public:
    virtual void quack() = 0;
};

class Quack:public QuackBehavior
{
public:
    Quack(){};
    void quack(){
        printf("Quack\n");
    }
};

class MuteQuack : public QuackBehavior
{
public:
    void quack(){
        printf("<Silence>");
    }
};

class Squeak: public QuackBehavior
{
public:
    void quack(){
        printf("Squeak");
    }
};
class Duck
{
public:
    FlyBehavior* flyBehavior;
    QuackBehavior* quackBehavior;

Duck(){};
    virtual void display(){};
    void performFly(){
        flyBehavior->fly();
    }
    void performQuack(){
        quackBehavior->quack();
    }
    void swim(){
        printf("All ducks float,even decoys!");
    }

//动态设定行为
    void setFlyBehavior(FlyBehavior* fb)
    {
        flyBehavior = fb;
    }

void setQuackBehavior(QuackBehavior* qb)
    {
        quackBehavior = qb;
    }

};

class MallardDuck : public Duck
{
public:
    MallardDuck()
    {
        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();
    }

void display()
    {
        printf("i'm a real Mallard duck");
    }
};

class ModelDuck : public Duck
{
public:
    ModelDuck()
    {
        flyBehavior = new FlyNoWay();
        quackBehavior = new Quack();
    }

void display(){
        printf("i'm a model duck");
    }
};

class FlyRocketPowered : public FlyBehavior{
public:
    void fly()
    {
        printf("i'm flying with a rocket!\n");
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    Duck* mallard = new MallardDuck();
    mallard->performQuack();
    mallard->performFly();

Duck* model = new ModelDuck();
    model->performFly();
    FlyBehavior* fb = new FlyRocketPowered();
    model->setFlyBehavior(fb);
    model->performFly();
    return 0;
}

设计模式入门,策略模式,c++代码实现的更多相关文章

  1. Head First设计模式 1 设计模式入门 策略模式 观察者模式

    关于基本的OOP特征: OOP的几大特征是抽象 继承 封装 多态. 我们把共同的部分抽象出来作为抽象类的存在,使用继承和接口来实现多态,然后私有的部分封装起来.一定程度上说,这些概念都是简单的设计模式 ...

  2. 设计模式入门,命令模式,c++代码实现

    // test06.cpp : Defines the entry point for the console application.////设计模式第5章 命令模式#include "s ...

  3. 设计模式入门,单件模式,c++代码实现

    // test05.cpp : Defines the entry point for the console application.// #include "stdafx.h" ...

  4. 设计模式入门,工厂模式,c++代码实现

    // test04.cpp : Defines the entry point for the console application.////设计模式第4章 工厂模式#include "s ...

  5. php设计模式之策略模式实例代码

    html <html> <head> <meta charset="UTF-8"> <title>简单计算器</title&g ...

  6. Python设计模式: 最佳的"策略"模式实践代码

    Python设计模式: 最佳的"策略"模式实践代码 今天抽空看了下流畅的python,发现里面介绍了不少python自带的库的使用实例,用起来非常的优雅. 平时用Python来写爬 ...

  7. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

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

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

  9. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

随机推荐

  1. ROS(URDF机器人建模)

    新建功能包mbot_description 在功能包下新建文件config,launch,meshes,urdf. 在launch文件夹下新建文件display_mbot_base_urdf.laun ...

  2. canvas图像绘制过程中的注意

    特别来记录一下canvas绘制图像,要在图片加载完后,才会将其显示在canvas画布之上,否则会显示不出来:深刻体会,愣是找不到问题... var c=document.getElementById( ...

  3. 关于android分辨率兼容问题

    关于手机分辨率相关术语和概念 屏幕尺寸:实际的物理尺寸,屏幕的对角线测量.为了方便,android把所有的屏幕尺寸分为了4个广义的大小:小,正常,大,特大. 屏幕密度:屏幕的物理面积内像素的数量,通常 ...

  4. python------对于面向对象的理解

    python中一切皆为对象 其实面向对象没什么高大上的东西,只不过把我们平时对于事物的描述和动作系统的总结成了一个定义事物的方法而已. 我们平时向别人介绍一个他(她)从未见过的东西,会从外形和外貌特征 ...

  5. Linux中的任务调度

    1.crond,linux中的任务调度器 crond的概念和crontab是不可分割的.crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入 ...

  6. 架构师养成记--16.disruptor并发框架中RingBuffer的使用

    很多时候我们只需要消息中间件这样的功能,那么直需要RinBuffer就可以了. 入口: import java.util.concurrent.Callable; import java.util.c ...

  7. 洛谷 P4774 / loj 2721 [NOI2018] 屠龙勇士 题解【同余】【exgcd】【CRT】

    推导过程存在漏洞+exCRT板子没打熟于是期望得分÷实际得分=∞? 题目描述 小 D 最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号 \(1\sim n​\) 顺序杀掉 \(n​\ ...

  8. Flutter框架概览

    前言:进入新框架的开发前,有必要整体了解框架设计及特点,对该框架初步认识,此文对Flutter框架进行浅显梳理,以备查阅: Flutter框架   从该架构图可知,Flutter框架可分为Framew ...

  9. IE8下不识别indexOf的问题

    1.为Array原型添加indexOf方法(如果学过面向对象,相当于给Array类添加实例方法),方法体如下: //添加数组IndexOf方法 if (!Array.prototype.indexOf ...

  10. C++11 实现生产者消费者双缓冲

    基础的生产者消费者模型,生产者向公共缓存区写入数据,消费者从公共缓存区读取数据进行处理,两个线程访问公共资源,加锁实现数据的一致性. 通过加锁来实现 class Produce_1 { public: ...