#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. Memcached遇到的问题及解决办法

    1. memcached make: *** No targets specified and no makefile found. Stop. 其实是因为在安装libevent时增加了版本号导致的, ...

  2. Arduino 开关控制小灯持续亮之具体思路

    Arduino 开关控制小灯持续亮之具体思路 为什么写这篇文章: 我们用开关控制灯的亮灭的时候,希望只需要按一下按键就可以做到灯一直亮着.而在<Arduino魔法书>中——有弹性的按键这一 ...

  3. linux下编译C/C++ 程序

    C/C++的速度是Python和perl所无法比拟的,尤其对于处理超大的生物信息学文件来说. 最近在写一个最简单的fastq cut工具,Python简直慢到不能忍,8G的fastq.gz文件的cut ...

  4. linux常用命令及系统常见符号

    常用命令 1.start x 进入界面 2.shutdown -h now 立刻关机 shutdown -r now 立刻重新启动 reboot 立刻重新启动 3.su root 切换成超级管理员 4 ...

  5. English trip M1 - AC9 Nosey people 爱管闲事的人 Teacher:Solo

    In this lesson you will learn to talk about what happened. 在本课中,您将学习如何谈论发生的事情. 课上内容(Lesson) # four “ ...

  6. WinForm下窗体权限设计

    权限设计   笔者不才看了园子里面很多园友写关于权限设计这块内容,那么笔者也在添一笔.这个是笔者在上完软件工程课程后,上交的一篇笔者论文,这里分享给大家交流,当然笔者经验尚浅,若内容有误,请大家指点出 ...

  7. 使用scrapy-crawlSpider 爬取tencent 招聘

    Tencent 招聘信息网站 创建项目 scrapy startproject Tencent 创建爬虫 scrapy genspider -t crawl tencent 1. 起始url  sta ...

  8. PHP的几种输出方式

    请写出echo.print_r.print.var_dump .die之间的区别 echo  只能输出字符串等单一数据 不能输出数据类型 不能输出数组等多种数据 print()  只能输出字符串等单一 ...

  9. Tempter of the Bone HDU - 1010

    The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it u ...

  10. 创建gitlab ssh 密钥

    SSH代表用于管理网络,操作系统和配置的Secure Shell或Secure Socket Shell,并且每次都不需要使用用户名和密码即可验证GitLab服务器. 您可以设置SSH密钥以提供计算机 ...