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. poj 3613 Cow Relays

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5411   Accepted: 2153 Descri ...

  2. Dia Diagram Mac OSX Yosemite Fix 闪退 xterm

    [转]http://navkirats.blogspot.hk/2014/10/dia-diagram-mac-osx-yosemite-fix-i-use.html I use the Dia to ...

  3. PHP实现Web Service(转)

    1.OAuth OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码)  2.SCA 服务组件 ...

  4. javascript运行机制之执行顺序详解(转)

    转自http://www.admin10000.com/document/3385.html JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言, ...

  5. XtraBackup原理4

    MySQL · 答疑解惑 · 物理备份死锁分析 背景 本文对 5.6 主备场景下,在备库做物理备份遇到死锁的case进行分析,希望对大家有所帮助. 这里用的的物理备份工具是 Percona-XtraB ...

  6. win7 下 qwt安装教程

    一.安装:qwt的安装很简单,可以参看它的install文档.1.解开下载下来的zip文件,比如解开到d:\qt\qwt-5.0.2目录下,修改目录下的qwtconfig.pri文件里面的安装路径,比 ...

  7. JAVAMAIL手动发送邮件

    telnet smtp.sina.com 25ehlo hncu/*ehlo命令是SMTP邮件发送程序与SMTP邮件接收程序建立连接后必须发送的第一条SMTP命令,参数<domain>表示 ...

  8. linux编辑器 vi的使用

    vi 编辑器的三个模式: 命令模式 开始就是命令模式 insert模式 i, I, a, A, o,O ,s, S 命令行模式 : i  在当前位置进入Insert模式 I  在行的头部进入Inser ...

  9. SqlServer高版本数据本分还原到低版本方法

    最近遇见一个问题: 想要将Sqlserver高版本备份的数据还原到低版本SqlServer上去,但是这在SqlServer中是没法直接还原数据库的,所以经过一系列的请教总结出来一下可用方法. 首先.你 ...

  10. hdu 3401 单调队列优化动态规划

    思路: 动态方程很容易想到dp[i][j]=max(dp[i][j],dp[i-w-1][j-k]-k*ap[i],dp[i-w-1][j+k]+k*bp[i]): dp[i][j]表示第i天拥有j个 ...