#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. c# winform 中的坐标系

    从数学角度讲,Point是一个二维矢量,包含两个公共整型属性,属性用大写X和Y(c#中公共属性一般约定以大写字母开头).当坐标不是整数值是float时,用PointF代替Point使用. 常用的Siz ...

  2. Python自学:第二章 使用制表符或换行符来添加空白

    print("Languages:\n\tPython\n\tC\n\tJava") 输出为: Languages: Python C Java

  3. manifest.xml微擎系统模块的安装文件内容

    微擎在安装或卸载模块时会根据manifest.xml生成(或删除)数据库中相应记录,并执行manifest.xml里指定的脚本. manifest.xml文件内容详细介绍如下: manifest - ...

  4. memcached的部署

    window下memcached注册服务 cmd:在学习Memcached时,为了模拟分布存储,常常需要建多个Memcached服务,如何建呢,只能使用命令行了 以管理员身份运行cmd,输入如下命令 ...

  5. 十分钟搞定pandas内容

    目录 十分钟搞定pandas 一.创建对象 二.查看数据 三.选择器 十二.导入和保存数据 参考:http://pandas.pydata.org/pandas-docs/stable/whatsne ...

  6. 【洛谷p1507】NASA的食物计划

    (一次a……) NASA的食物计划[传送门] 好的上算法标签: 嗯这是个二维背包 (万年不变分隔线) 二维的题就是在一维基础上增加了一个条件,这个背包不仅含有质量还有体积.所以我们增加一层循环.核心算 ...

  7. 『cs231n』通过代码理解gan网络&tensorflow共享变量机制_上

    GAN网络架构分析 上图即为GAN的逻辑架构,其中的noise vector就是特征向量z,real images就是输入变量x,标签的标准比较简单(二分类么),real的就是tf.ones,fake ...

  8. mysql排序的中文首字母排序和自定义排序

    select * FROM organ_new where city_code = 'SZ0755' and organ_type = 'H' and state = '1' ORDER BY FIE ...

  9. rac 关库 启库

    关库顺序 先关闭数据库 然后关闭节点资源 [root@rac1 ~]# srvctl stop   database  -d prod[root@rac1 ~]# srvctl stop   inst ...

  10. servlet-api-2.4.jar not loaded(转)

    信息: validateJarFile(D:/xj/workspace/webworktest/webapp/WEB-INF/lib/servlet-api-2.4.jar) - jar not lo ...