#ifndef __QUAKEABLE_H__
#define __QUAKEABLE_H__
#include <iostream>
#include <vector>
using namespace std;
class QuackObservable;
class Observer
{
public:
Observer(){}
virtual~Observer(){}
virtual void update(QuackObservable *d)
{
cout << "Observer update " << endl;
}
}; class QuackObservable
{
public:
QuackObservable(){}
virtual ~QuackObservable(){}
virtual void RegisterObserver(Observer *q1)
{ }
virtual void NotifyObserver()
{
cout << "Notify Observer update " << endl;
}
}; class QuakeLogist:public Observer
{
public:
QuakeLogist(){}
virtual ~QuakeLogist(){}
virtual void update(QuackObservable *d)
{
cout << "QuakeLogist update " << endl;
}
}; class ObserveAble : public QuackObservable
{
private:
QuackObservable *q;
vector<Observer*>olist;
public:
ObserveAble(QuackObservable *qq){ q = qq; }
virtual ~ObserveAble(){}
virtual void RegisterObserver(Observer *q1)
{
olist.push_back(q1);
}
virtual void NotifyObserver()
{
vector<Observer*>::iterator it = olist.begin();
while (it!= olist.end())
{
(*it++)->update(q);
}
}
}; class Quakeable :public QuackObservable
{
public:
Quakeable(){}
virtual~Quakeable(){}
virtual void Quake(){}
}; class MallardDuck :public Quakeable
{
private:
ObserveAble *obseAble;
public:
MallardDuck()
{
obseAble = new ObserveAble(this);
}
virtual ~MallardDuck(){}
virtual void Quake()
{
cout << "MallardDuck Quake" << endl;
NotifyObserver();
}
virtual void RegisterObserver(Observer *os)
{
obseAble->RegisterObserver(os);
}
virtual void NotifyObserver()
{
obseAble->NotifyObserver();
}
}; class BlueDuck :public Quakeable
{
public:
BlueDuck(){}
virtual~BlueDuck(){}
virtual void Quake()
{
cout << "Blue Duck Quake" << endl;
}
}; class RedDuck :public Quakeable
{
public:
RedDuck(){}
virtual~RedDuck(){}
virtual void Quake()
{
cout << "Red Duck Quake" << endl;
}
}; class DuckCall :public Quakeable
{
public:
DuckCall(){}
virtual~DuckCall(){}
virtual void Quake()
{
cout << "DuckCall Quake" << endl;
}
}; class RubberDuck :public Quakeable
{
public:
RubberDuck(){}
virtual~RubberDuck(){}
virtual void Quake()
{
cout << "Rubber Duck Quake" << endl;
}
}; class QuackCounter :public Quakeable
{
private:
Quakeable *duck;
static int number;
public:
QuackCounter(Quakeable *q)
{
duck = q;
}
virtual~QuackCounter(){}
virtual void Quake()
{
duck->Quake();
number++;
}
static int getNum()
{
return number;
}
}; int QuackCounter::number = 0;
#endif
#ifndef __GOOSE_H__
#define __GOOSE_H__
#include "Quakable.h" class Goose
{
public:
Goose(){}
virtual~Goose(){}
virtual void honk()
{
cout << "Goose honk" << endl;
}
}; class GooseAdapter :public Quakeable
{
private:
Goose *goose;
public:
GooseAdapter(Goose *g)
{
goose = g;
} virtual~GooseAdapter(){}
virtual void Quake()
{
goose->honk();
}
}; class AbDuckFactory
{
public:
AbDuckFactory(){}
virtual~AbDuckFactory(){}
virtual Quakeable * CreateBlueDuck() = 0;
virtual Quakeable * CreateRedDuck() = 0;
virtual Quakeable * CreateCallDuck() = 0;
virtual Quakeable * CreateRubberDuck() = 0;
}; class DuckFactory : public AbDuckFactory
{
public:
DuckFactory(){}
virtual~DuckFactory(){}
virtual Quakeable * CreateBlueDuck() { return new BlueDuck(); }
virtual Quakeable * CreateRedDuck(){ return new RedDuck(); }
virtual Quakeable * CreateCallDuck() { return new DuckCall(); }
virtual Quakeable * CreateRubberDuck() { return new RubberDuck(); }
}; class CountFactory : public AbDuckFactory
{
public:
CountFactory(){}
virtual~CountFactory(){}
virtual Quakeable * CreateBlueDuck() { return new QuackCounter(new BlueDuck()); }
virtual Quakeable * CreateRedDuck(){ return new QuackCounter(new RedDuck()); }
virtual Quakeable * CreateCallDuck() { return new QuackCounter(new DuckCall()); }
virtual Quakeable * CreateRubberDuck() { return new QuackCounter(new RubberDuck()); }
}; class DuckFlock :public Quakeable
{
private:
ObserveAble *obs;
vector<Quakeable *> ducklist;
public:
DuckFlock()
{
obs = new ObserveAble(this);
}
virtual~DuckFlock(){}
void add(Quakeable *t)
{
ducklist.push_back(t);
}
virtual void Quake()
{
vector<Quakeable*>::iterator it = ducklist.begin();
while (it != ducklist.end())
{
(*it++)->Quake();
NotifyObserver();
} } virtual void RegisterObserver(Observer *ob)
{
obs->RegisterObserver(ob);
} virtual void NotifyObserver()
{
obs->NotifyObserver();
}
}; #endif
#include <iostream>
#include "Quakable.h"
#include "Goose.h"
using namespace std;
void simulate()
{
AbDuckFactory *f = new CountFactory(); Quakeable *r = f->CreateBlueDuck();
Quakeable *b =f->CreateCallDuck();
Quakeable *d = f->CreateRedDuck();
Quakeable *rub = f->CreateRubberDuck();
Quakeable *g = new QuackCounter(new GooseAdapter(new Goose())); r->Quake();
b->Quake();
d->Quake();
rub->Quake();
g->Quake();
cout << "Fuck " << QuackCounter::getNum() << endl; Quakeable *r1 = f->CreateBlueDuck();
Quakeable *r2 = f->CreateBlueDuck();
Quakeable *r3 = f->CreateBlueDuck();
Quakeable *r4 = f->CreateBlueDuck(); DuckFlock *df = new DuckFlock();
df->add(r1);
df->add(r2);
df->add(r3);
df->add(r4); cout << "Fuck " << QuackCounter::getNum() << endl;
QuakeLogist *ql = new QuakeLogist();
// Quakeable *qa = new MallardDuck();
// qa->RegisterObserver(ql);
// qa->Quake(); df->RegisterObserver(ql);
df->Quake(); } int main()
{ simulate(); return 0;
}

:复合模式:duck的更多相关文章

  1. Head First设计模式——复合模式

    复合模式是HeadFirst上面详细讲的最后一个模式,其前面的模式作者认为都是成熟的经常使用的模式.所以这是详细讲解模式的最后一篇,同时这个模式讲解的篇幅也是最长的,接下来我就对其进行总结提炼进行讲解 ...

  2. 【HeadFirst设计模式】12.复合模式

    定义: 复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题. 要点: MVC模式是复合模式,结合了观察者模式.策略模式和组合模式. 模型使用了观察者模式,以便观察者更新,同时保存 ...

  3. Java 设计模式_复合模式(2016-08-31)

    一.什么是复合模式? 在形式上,复合模式确实是多个模式的组合,但满足了这一条并不一定是复合模式,注意它的定义: 将多个模式结合起来形成一个“框架”,以解决一般性问题 一提到“框架”,可能最容易联想到的 ...

  4. 设计模式学习--复合模式(Compound Pattern)

    设计模式学习--复合模式(Compound Pattern) 概述 ——————————————————————————————————————————————————— 2013年8月4日<H ...

  5. 设计模式之复合模式(Compound Pattern)

    一.什么是复合模式? 在形式上,复合模式确实是多个模式的组合,但满足了这一条并不一定是复合模式,注意它的定义: 将多个模式结合起来形成一个“框架”,以解决一般性问题 一提到“框架”,可能最容易联想到的 ...

  6. 用最简单的例子理解复合模式(Composite Pattern)

    在显示树形结构时,复合模式有很好的体现.本篇显示如下部门结构: 以上,有的节点包含子节点,有的节点部包含子节点.不管是什么节点,每个节点就代表一个部门. 首先设计一个关于部门的抽象基类. public ...

  7. Java - 复合模式优于继承

    继承是实现代码重用的方法之一,但使用不当则会导致诸多问题. 继承会破坏封装性,对一个具体类进行跨包访问级别的继承很危险. 即,子类依赖父类的实现细节. 如果父类的实现细节发生变化,子类则可能遭到破坏. ...

  8. Android中MVC模型(复合模式)

    mvc是model,view,controller的缩写,mvc包括三个部分: 1.模型(model)对象:是应用程序的主体部分,全部的业务逻辑都应该写在该层. 2.视图(view)对象:是应用程序中 ...

  9. Qt 2D绘图之三:绘制文字、路径、图像、复合模式

    一.绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::font ...

  10. java设计模式----复合模式

    复合模式:复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题 要点: 1.MVC是复合模式,结合了观察者模式.策略模式和组合模式 2.模型使用观察者模式,以便观察者更新,同时保持 ...

随机推荐

  1. Windows Live Wirter

    安装: 下载: Windows Live Writer (QQ 里) windows live writer 日志服务器发生问题 更新账户信息 从字面"editPost"我们不难看 ...

  2. 自定义广播(BroadcastReceiver)事件 --Android开发

    本例演示自定义广播事件.我们需要做的是,在主活动中写发送广播的代码,然后在接收广播的类中写接收广播的代码. 1.主活动中点击按钮后发送广播 MainActivity.java: public clas ...

  3. C# 测试代码段性能耗时

     一:              DateTime BeginTime = System.DateTime.Now;            //代码            DateTime EndTi ...

  4. H.264开源解码器评测

    转自:http://wmnmtm.blog.163.com/blog/static/38245714201142883032575/ 要播放HDTV,就首先要正确地解开封装,然后进行视频音频解码.所以 ...

  5. Mycat水平拆分之十种分片规则

    水平切分分片实现   配置schema.xml  在同一个mysql数据库中,创建了三个数据库 testdb1,testdb2,testdb3.并在每个库中都创建了user表     <?xml ...

  6. 如何查找php-fpm监听的端口

    1. 找到php的安装位置.如: /usr/local/php-7.3.3 2. 进入安装目录下的etc/php-fpm.d目录,然后你会看到: 3. 打开www.conf,搜索listen关键字,你 ...

  7. js动态修改title

    问题描述: 由于微信浏览器只在页面首次加载时初始化了标题title,之后就没有再监听 window.title的change事件.所以这里修改了title后,立即创建一个请求,加载一个空的iframe ...

  8. git 推送出现 "fatal: The remote end hung up unexpectedly" 解决方案

    本文转载于:https://blog.csdn.net/zcmain/article/details/76855595 https://blog.csdn.net/u012973744/article ...

  9. CF-517C-思维/math

    http://codeforces.com/contest/1072/problem/C 题目大意是给出两个数a,b ,找出若干个数p,使得 SUM{p}<=a ,找出若干个数q使得SUM{q} ...

  10. PY3 多组输入

    在c语言你能使用while(scanf(“%d”,x) !=EOF)判断输入是否碰到文件结束符(EOF). 但是在python你不能使用while((x=input())!=EOF). 这有两种方法可 ...