#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. R语言画点状误差线

    现在项目需要R语言做几个线性拟合,画一些点图,突然需要画误差线,网上找了下,可以用代码实现..效果如下 xx1<-c(xxxxxx,xxxx,xxxxx) yy1<-c(xxxxxx,xx ...

  2. Ubuntu更改源和搜狗输入法安装卸载

    安装完Ubuntu 16.04后,要更换为国内的软件源: sudo gedit /etc/apt/sources.list   #用文本编辑器打开源列表 在文件开头添加下面的阿里云的软件源: deb ...

  3. HTML 第十一章总结

    # 第十一章总结:本章的标题为:layout and positioning Arranging Element##前言:这一章节,通过已经知道的 box model 的概念,进行讲述关于 layou ...

  4. javaweb课程信息管理系统

    1.DBUtil包连接数据库 2.Bin包设计成员函数及方法 3.Dao包设计sql语句 4.servlet包增删改查方法 5.service连接servlet 6.设计jsp增删改查页面 7.连接各 ...

  5. gleez框架获得时间控件

    1,首先你要在你的页面上引用一个js <script src="<?php echo URL::base() ?>media/vendor/datepicker/Wdate ...

  6. Leetcode 860. 柠檬水找零

    860. 柠檬水找零  显示英文描述 我的提交返回竞赛   用户通过次数187 用户尝试次数211 通过次数195 提交次数437 题目难度Easy 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾 ...

  7. WDA基础一:激活相关服务

    一个普通得系统,如果之前没动过相关配置而又想做做WDA程序,是需要激活几个服务的. 1.激活服务 事务码:SICF 默认SERVICE,执行. Service:default_host/sap/opt ...

  8. [洛谷 P2709] 小B的询问

    P2709 小B的询问 题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数 ...

  9. 彻底理解MapReduce shuffle过程原理

    彻底理解MapReduce shuffle过程原理 MapReduce的Shuffle过程介绍 Shuffle的本义是洗牌.混洗,把一组有一定规则的数据尽量转换成一组无规则的数据,越随机越好.MapR ...

  10. IIS无法启动,应用程序池自动关闭

    问题:打开网站中的资源,对应的应用程序池就自动停止 解决方案:在应用程序池上--右键--高级设置--进程模型--标识,更改了这项里的“内置账户”.将原有的“ApplicationPoolIdentit ...