observer.h

 #ifndef _OBSERVER_H_
#define _OBSERVER_H_ #include <string>
class Observer {
public:
virtual void update(const std::string &type) = ;
};
#endif

quack_observable.h

 #ifndef _QUACK_OBSERVABLE_H_
#define _QUACK_OBSERVABLE_H_ #include "observer.h" class QuackObservable {
public:
virtual void register_observer(Observer *observer) = ;
virtual void notify_observers() = ;
};
#endif

duck.h

 #ifndef _DUCK_H_
#define _DUCK_H_ #include "quack_observable.h"
class Duck : public QuackObservable{
public:
virtual void quack() = ;
};
#endif

observable.h

 #ifndef _OBSERVABLE_H_
#define _OBSERVABLE_H_ #include "quack_observable.h"
#include <vector> class Observable : public QuackObservable {
private:
std::vector<Observer *> observers;
const std::string type;
public:
Observable( const std::string &_type ) : type(_type) {}
void register_observer(Observer *observer) { observers.push_back( observer ); }
void notify_observers() {
for ( std::vector<Observer *>::iterator it = observers.begin();
it < observers.end();
it ++ ) {
(*it)->update( type );
}
}
};
#endif

mallard_duck.h

 #ifndef _MALLARD_DUCK_H_
#define _MALLARD_DUCK_H_ #include <iostream>
#include "duck.h"
#include "observable.h" class MallardDuck : public Duck{
private:
Observable observable;
public:
MallardDuck() :observable("Mallard duck") {}
void quack() { std::cout << "Quack" << std::endl; notify_observers(); }
void register_observer(Observer *observer) { observable.register_observer(observer); }
void notify_observers() { observable.notify_observers(); }
}; #endif

redhead_duck.h

 #ifndef _REDHEAD_DUCK_H_
#define _REDHEAD_DUCK_H_ #include <iostream>
#include "duck.h"
#include "observable.h"
class RedheadDuck : public Duck{
private:
Observable observable;
public:
RedheadDuck() :observable("Redhead Duck") {}
void quack() { std::cout << "Quack" << std::endl; notify_observers();}
void register_observer(Observer *observer) { observable.register_observer(observer); }
void notify_observers() { observable.notify_observers(); }
}; #endif

duck_call.h

 #ifndef _DUCK_CALL_H_
#define _DUCK_CALL_H_ #include <iostream>
#include "duck.h"
#include "observable.h" class DuckCall : public Duck{
private:
Observable observable;
public:
DuckCall() :observable("Duck call") {}
void quack() { std::cout << "Kwak" << std::endl; notify_observers(); }
void register_observer(Observer *observer) { observable.register_observer(observer); }
void notify_observers() { observable.notify_observers(); }
}; #endif

rubber_duck.h

 #ifndef _RUBBER_DUCK_H_
#define _RUBBER_DUCK_H_ #include <iostream>
#include "duck.h"
#include "observable.h"
class RubberDuck : public Duck{
private:
Observable observable;
public:
RubberDuck() :observable("Rubber Duck") {}
void quack() { std::cout << "Squeak" << std::endl; notify_observers();}
void register_observer(Observer *observer) { observable.register_observer(observer); }
void notify_observers() { observable.notify_observers(); }
}; #endif

countable_duck.h

 #ifndef _COUNTEABLE_DUCK_H_
#define _COUNTEABLE_DUCK_H_ #include "duck.h"
class CountableDuck : public Duck{
public:
CountableDuck( Duck *_duck ) : duck(_duck) {}
void quack() { duck->quack(); quack_count ++; }
void register_observer(Observer *observer) { duck->register_observer(observer); }
void notify_observers() { duck->notify_observers(); }
static int get_quack_count() { return quack_count; }
private:
Duck *duck;
static int quack_count;
};
#endif

countable_duck.cpp

 #include "countable_duck.h"

 int CountableDuck::quack_count = ;

ivector.h

 #ifndef _IVECTOR_H_
#define _IVECTOR_H_ #include <vector>
#include <stdlib.h> template<class T> class IVector {
public:
IVector() : pos() {}
void add( const T& t ) { t_v.push_back(t); }
bool has_next() { return pos < t_v.size(); }
T* next() {
if ( has_next() ) {
return &(t_v[pos++]);
}
return NULL;
}
void back_to_begin() { pos = ; }
private:
int pos;
std::vector<T> t_v;
};
#endif

duck_factory.h

 #ifndef _DUCK_FACTORY_H_
#define _DUCK_FACTORY_H_ #include "mallard_duck.h"
#include "redhead_duck.h"
#include "duck_call.h"
#include "rubber_duck.h"
#include "countable_duck.h"
#include <string> class SimpleDuckFactory {
public:
static Duck* create_duck( std::string type ) {
if ( type == "mallard" ) { return new CountableDuck( new MallardDuck ); }
if ( type == "redhead" ) { return new CountableDuck( new RedheadDuck ); }
if ( type == "call" ) { return new CountableDuck( new DuckCall ); }
if ( type == "rubber" ) { return new CountableDuck( new RubberDuck ); }
return NULL;
}
}; class AbstractDuckFactory {
public:
static Duck *create_mallard_duck() { return new CountableDuck( new MallardDuck ); }
static Duck *create_redhead_duck() { return new CountableDuck( new RedheadDuck ); }
static Duck *create_duck_call() { return new CountableDuck( new DuckCall ); }
static Duck *create_rubber_duck() { return new CountableDuck( new RubberDuck ); }
};
#endif

flock.h

 #ifndef _FLOCK_H_
#define _FLOCK_H_ #include "duck.h"
#include "ivector.h" class Flock : public Duck{
public:
void quack() {
ducks.back_to_begin();
while( ducks.has_next() ) {
(*(ducks.next()))->quack();
}
}
void add( Duck *duck ) { ducks.add(duck); }
void register_observer(Observer *observer) {
ducks.back_to_begin();
while( ducks.has_next() ) {
(*(ducks.next()))->register_observer(observer);
}
}
void notify_observers() {
ducks.back_to_begin();
while( ducks.has_next() ) {
(*(ducks.next()))->notify_observers();
}
}
private:
IVector<Duck *> ducks;
};
#endif

goose.h

 #ifndef _GOOSE_H_
#define _GOOSE_H_ #include <iostream>
class Goose {
public:
void honk() { std::cout << "Honk" << std::endl; }
};
#endif

goose_adapter.h

 #ifndef _GOOSE_ADAPTER_H_
#define _GOOSE_ADAPTER_H_ #include "goose.h"
#include "duck.h"
#include "observable.h" class GooseAdapter : public Duck{
public:
GooseAdapter( Goose *_goose ) : goose(_goose), observable("Goose pretending to be a duck") {}
void quack() { goose->honk(); notify_observers();}
void register_observer(Observer *observer) { observable.register_observer(observer); }
void notify_observers() { observable.notify_observers(); }
private:
Goose *goose;
Observable observable;
};
#endif

quackologist.h

 #ifndef _QUACK_OLOGIST_H_
#define _QUACK_OLOGIST_H_ #include "observer.h"
#include <iostream>
#include <string> class QuackOlogist : public Observer {
public:
void update(const std::string &type ) { std::cout << "Quackologist: " << type << " just quacked." << std::endl; }
};
#endif

main.cpp

 #include "goose_adapter.h"
#include "duck_factory.h"
#include "countable_duck.h"
#include <iostream>
#include "flock.h"
#include "quackologist.h" void simulate(Duck *duck) {
if ( NULL != duck ) { duck->quack(); }
} int main() {
Flock *flock_of_mallard = new Flock;
flock_of_mallard->add( AbstractDuckFactory::create_mallard_duck() );
flock_of_mallard->add( AbstractDuckFactory::create_mallard_duck() ); Flock *flock_of_ducks = new Flock; flock_of_ducks->add( new CountableDuck(new GooseAdapter( new Goose ))); flock_of_ducks->add( AbstractDuckFactory::create_redhead_duck() );
flock_of_ducks->add( AbstractDuckFactory::create_duck_call() );
flock_of_ducks->add( AbstractDuckFactory::create_rubber_duck() ); flock_of_ducks->add( flock_of_mallard ); QuackOlogist quackologist;
flock_of_ducks->register_observer(&quackologist); simulate( flock_of_ducks ); std::cout << "quack count: " << CountableDuck::get_quack_count() << std::endl;
};

Headfirst设计模式的C++实现——复合模式的更多相关文章

  1. headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式

    先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...

  2. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  3. 《Head First 设计模式》学习笔记——复合模式

    模型-视图-控制器(MVC模式)是一种很经典的软件架构模式.在UI框架和UI设计思路中扮演着很重要的角色.从设计模式的角度来看,MVC模式是一种复合模式.它将多个设计模式在一种解决方式中结合起来,用来 ...

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]

     1  2 {<HeadFirst设计模式>工厂模式之抽象工厂 }  3 { 抽象工厂的产品                       }  4 { 编译工具:Delphi7.0     ...

  5. Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---组合模式之Menus[转]

     1  2{<HeadFirst设计模式>之组合模式 }  3{ 组合与单项的抽象父类           }  4{ 编译工具:Delphi2007 for win32}  5{ E-M ...

  6. Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---工厂模式之工厂方法[转]

      1   2{<HeadFirst设计模式>工厂模式之工厂方法 }   3{ 产品类                              }   4{ 编译工具 :Delphi20 ...

  7. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]

    模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override).   1   2{<HeadFirst设计模式>之模板方法模式 }   3{ 编译工具: Del ...

  8. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu[转]

    容器的主要职责有两个:存放元素和浏览元素.根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器. 用迭代器封装对动态数组的遍历:  1  2{<HeadFirst设计模式& ...

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

     1  2{<HeadFirst设计模式>之策略模式 }  3{ 本单元中的类为策略类           }  4{ 编译工具: Delphi7.0           }  5{ E- ...

随机推荐

  1. JAVA中调用CMD命令,并输出运行结果

    package com.wzw.util; import java.io.BufferedReader; import java.io.InputStreamReader; public class ...

  2. range-bar

    https://github.com/edmodo/range-bar

  3. DWRUtil is not defined

    错误:DWRUtil is not defined; 解决方法: 先检查页面中是否正确引入uitl.js <script type="text/javascript" src ...

  4. iOS开发UI-利用Quartz2D 实现基本绘图(画三角形、矩形、圆、圆弧)

    1.画三角形  运行结果如下 1.1具体实现步骤 1.1.1首先新建一个project,然后自定义一个view 1.2代码 #import "htingShapeView.h" @ ...

  5. ABAP EXCEL 文件上传下载 用SMW0

    T-CODE: SMW0 在这里只介绍二进制数据,HTML模板的上传也一样. 另外也可以用CBO TABLE管理文件 可以看我另一个博文:CBO TABLE管理文件上传下载 选择 二进制 写包名: 进 ...

  6. C++之运算符重载(2)

    上一节主要讲解了C++里运算符重载函数,在看了单目运算符(++)重载的示例后,也许有些朋友会问这样的问题.++自增运算符在C或C++中既可以放在操作数之前,也可以放在操作数之后,但是前置和后置的作用又 ...

  7. CollatingOfData 之 JsonHelper

    1 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System. ...

  8. SSH Spring3\Java1.8 “Unable to instantiate Action, xxAction, defined for 'xxAction_login' in namespace '/'null”

    1.Stacktraces Unable to instantiate Action,xxAction, defined for 'xxAction_login' in namespace '/'nu ...

  9. Java 并发专题 : Timer的缺陷 用ScheduledExecutorService替代

    继续并发,上篇博客对于ScheduledThreadPoolExecutor没有进行介绍,说过会和Timer一直单独写一篇Blog. 1.Timer管理延时任务的缺陷 a.以前在项目中也经常使用定时器 ...

  10. Emacs 配置 Python 编程环境

    python编程环境设置涉及到:自动完成.语法检查.虚拟环境. 为了不把系统搞乱,在python的虚拟环境中安装相关的插件. 一.安装python虚拟环境 virtualenvwrapper sudo ...