Headfirst设计模式的C++实现——策略模式(Strategy)

前言

最近在学习《Headfirst设计模式》,里面的例子都是Java的。但是我对Java并不熟悉,所以试着用C++来实现书中的例子。

先来看看Duck以及子类

Duck.h

 1 #include <iostream>
 2 #include "FlyBehavior.h"
 3
 4 class Duck
 5 {
 6 private:
 7     FlyBehavior *m_p_fly_behavior;
 8 public:
 9     virtual void quack() { std::cout << "--quack--" << std::endl; }
10     virtual void swim() { std::cout << "--swim--" << std::endl; }
11     virtual void display() { std::cout << "--duck--" << std::endl; }
12
13     virtual void fly() { if ( NULL != m_p_fly_behavior) { m_p_fly_behavior->fly(); } };
14     void set_fly_behavior( FlyBehavior *p_fly_behavior) { m_p_fly_behavior = p_fly_behavior; }
15
16     Duck() : m_p_fly_behavior(NULL) {}
17     virtual ~Duck() { if (m_p_fly_behavior) { delete m_p_fly_behavior; } }
18 };

MallardDuck.h

1 #include "Duck.h"
2 #include "FlyWithWings.h"
3
4 class MallardDuck : public Duck
5 {
6 public:
7     void display() { std::cout << "--MallardDuck--" << std::endl; }
8     MallardDuck() { set_fly_behavior( new FlyWithWings() ); }
9 };

RedheadDuck.h

1 #include "FlyWithWings.h"
2 class RedheadDuck : public Duck
3 {
4 public:
5     void display() { std::cout << "--RedheadDuck--" << std::endl; }
6     RedheadDuck() { set_fly_behavior( new FlyWithWings() ); }
7 };

RubberDuck.h

1 #include "FlyNoWay.h"
2
3 class RubberDuck : public Duck
4 {
5 public:
6     void display() { std::cout << "--RubberDuck--" << std::endl; }
7     void quack() { std::cout << "--squeak--" << std::endl; }
8     RubberDuck() { set_fly_behavior( new FlyNoWay() ); }
9 };

再来看看FlyBehavior类及其子类

FlyBehavior.h

1 #include <iostream>
2
3 class FlyBehavior
4 {
5 public:
6     virtual void fly() {};
7     virtual ~FlyBehavior() {};
8 };

FlyWithWings.h

1 #include "FlyBehavior.h"
2
3 class FlyWithWings : public FlyBehavior
4 {
5 public:
6     void fly () { std::cout << "--fly with wings--" << std::endl; }
7 };

FlyNoWay.h

1 #include "FlyBehavior.h"
2
3 class FlyNoWay : public FlyBehavior
4 {
5 public:
6     void fly() { std::cout << "--can not fly--" << std::endl; }
7 };

最后是主函数

main.cpp

 1 #include "MallardDuck.h"
 2 #include "RedheadDuck.h"
 3 #include "RubberDuck.h"
 4 #include <vector>
 5
 6 void test()
 7 {
 8     std::vector<Duck *> p_ducks;
 9     p_ducks.push_back( new MallardDuck() );
10     p_ducks.push_back( new RedheadDuck() );
11     p_ducks.push_back( new RubberDuck() );
12
13     for (std::vector<Duck *>::iterator it = p_ducks.begin(); it < p_ducks.end(); it ++)
14     {
15         std::cout << std::endl;
16         (*it)->display();
17         (*it)->quack();
18         (*it)->swim();
19         (*it)->fly();
20         delete (*it);
21     }
22 }
23
24 int main()
25 {
26     while (true)
27     {
28         test();
29     }
30 }

稍作解释

main函数中死循环的调用test函数的意图是测试以上实现有没有内存泄露。

时间: 2024-11-08 07:51:47

Headfirst设计模式的C++实现——策略模式(Strategy)的相关文章

设计模式(二)策略模式(Strategy)

1.分析项目中变化部分与不变部分 2.多用组合,少用继承:用行为类组合,而不是行为的继承 案例: 第一步,把行为抽象为接口 package top.littlepage.designPattern.Strategy; public interface FlyBehavior { void fly(); } 第二步,把具体行为用实体类实现 package top.littlepage.designPattern.Strategy; public class BadFly implements Fl

设计模式(行为型)之策略模式(Strategy Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之迭代器模式(Iterator Pattern)>http://blog.csdn.net/yanbober/article/details/45497881 概述 使用策略模式可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法,在这里,每一个封

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

 1 2{<HeadFirst设计模式>之策略模式 } 3{ 本单元中的类为策略类           } 4{ 编译工具: Delphi7.0           } 5{ E-Mail : [email protected]   } 6 7unit uStrategy; 8 9interface1011type12  {飞行接口,及其实现类 }1314  IFlyBehavior = Interface(IInterface)15    procedure Fly;16  end;1718

设计模式之二:策略模式(Strategy)

策略模式(strategy)定义了一个算法家族,这个算法家族封装了一系列的算法,但是这些算法之间是相互可以替换的.策略模式让算法的变化和它们调用者的变化分离开来了. UML图如下: 主要包括: Strategy:声明了一个对所有算法而言通用的接口类,下面的Contex类使用这个接口来调用一个一个具体的Stragety的算法. ConcreteStrategy:使用Strategy这个接口具体化的算法类 Context:通过一个指向具体的Strategy的指针来操作这个具体的Strategy对象.

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

1.书中举了一个鸭子类的设计,有些会飞或者会叫,有些不会飞可能也不会叫,用继承则导致不该有的功能通过继承而继承了下来,使用接口则代码无法做到最大程度的重用.进而引出设计原则1:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起,把会变化的部分取出并封装起来,好让其他部分不会受到影响.——每个设计模式背后的精神所在. 2.我们希望运行时动态的改变一些行为,这就引出了第二个原则:针对接口编程,而不是针对实现编程. 因此,鸭子的行为将被放在分开的类——我们可以将其叫做“行为

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式 - 策略模式(Strategy Pattern) 具体解释

策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全部, 禁止转载, 如有须要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间能够相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族须要常常扩展新的功能, 为了使用父类比較灵活的加入子类, 把父类的行为写成接口(interface)的形式; 使用set()方法

设计模式 ( 十八 ) 策略模式Strategy(对象行为型)

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕该功能.如查找.排序等,一种经常使用的方法是硬编码(Hard Coding)在一个类中,如须要提供多种查找算法,能够将这些算法写到一个类中,在该类中提供多个方法,每个方法相应一个详细的查找算法:当然也能够将这些查找算法封装在一个统一的方法中,通过if-else-或者case等条件推断语句来进行选择.

设计模式 - 策略模式(Strategy Pattern) 详解

策略模式(Strategy Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权所有, 禁止转载, 如有需要, 请站内联系. 策略模式: 定义了算法族, 分别封装起来, 让它们之间可以相互替换, 此模式让算法的变化独立于使用算法的客户. 对于父类的子类族需要经常扩展新的功能, 为了使用父类比较灵活的添加子类, 把父类的行为写成接口(interface)的形式; 使用set()方法,