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. iOS开发——数据持久化&本地数据的存储(使用NSCoder将对象保存到.plist文件)

    本地数据的存储(使用NSCoder将对象保存到.plist文件)   下面通过一个例子将联系人数据保存到沙盒的“documents”目录中.(联系人是一个数组集合,内部为自定义对象).   功能如下: ...

  2. 实例源码--Android简单音乐播放器源码

      下载源码   技术要点: 1.本地音乐管理 2.在线音乐听歌.下载 3.音频流的解码 4. HTTP通信模块 5. Sqlite数据库 6. 源码带详细的中文注释 ...... 详细介绍: 1.本 ...

  3. (转)ReSharper 配置及用法

    1:安装后,Resharper会用他自己的英文智能提示,替换掉 vs2010的智能提示,所以我们要换回到vs2010的智能提示 2:快捷键.是使用vs2010的快捷键还是使用 Resharper的快捷 ...

  4. 每天2个android小例子----简单计算器源代码

    通过Android4.0 网格布局GridLayout来实现一个简单的计算器界面布局 package com.android.xiong.gridlayoutTest; import java.mat ...

  5. 小白日记31:kali渗透测试之Web渗透-扫描工具-Arachni

    扫描工具-Arachni Kali中集成旧的arachni的阉割版,所以需要重新安装[在某些方面有其独特性,但不算很强大,有命令行和web两种使用方式][匿名者推荐] apt-get update h ...

  6. Index Generation

    Index Generation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 230   Accepted: 89 Des ...

  7. 把旧的项目改变名称重新部署到tomcat下发现项目名称还是原来的项目名称,解决方案

    选中项目右键点击properties 在type file text 中输入web 选择web在右边可以看到web-context-root 把里面的项目名称改成你最新的就ok了

  8. python 调用zabbix api接口实现主机的增删改查

    python程序调用zabbix系统的api接口实现对zabbix_server端主机的增删改查,使用相关功能时候,需要打开脚本中的相关函数. 函数说明: zabbixtools()  调用zabbi ...

  9. ie6双边距bug及其解决办法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. Org-mode 任务添加提醒

    org-mode中的约会日程有提醒功能,这样设置就行: ;; ;;; 提醒 ;; (require 'appt) ;; (appt-activate t);启用约会提醒 ;; (setq appt-d ...