设计模式(四)

迭代器模式

   GOOD:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示。

为遍历不同的聚集结构提供如开始,下一个,是否结束,当前一项等统一接口。

例:

#include <iostream>

#include <vector>

using namespace std;

template<class Item>

class Iterator

{

public:

virtual void first()=0;

virtual void next()=0;

virtual Item* currentItem()=0;

virtual bool isDone()=0;

virtual ~Iterator(){}

};

template<class Item>

class ConcreteAggregate;

template<class Item>

class ConcreteIterator : public Iterator <Item>

{

ConcreteAggregate<Item> * aggr;

int cur;

public:

ConcreteIterator(ConcreteAggregate<Item>*a):aggr(a),cur(0){}

virtual void first()

{

cur=0;

}

virtual void next()

{

if(cur<aggr->getLen())

cur++;

}

virtual Item* currentItem()

{

if(cur<aggr->getLen())

return &(*aggr)[cur];

else

return NULL;

}

virtual bool isDone()

{

return (cur>=aggr->getLen());

}

};

template<class Item>

class Aggregate

{

public:

virtual Iterator<Item>* createIterator()=0;

virtual ~Aggregate(){}

};

template<class Item>

class ConcreteAggregate:public Aggregate<Item>

{

vector<Item >data;

public:

ConcreteAggregate()

{

data.push_back(1);

data.push_back(2);

data.push_back(3);

}

virtual Iterator<Item>* createIterator()

{

return new ConcreteIterator<Item>(this);

}

Item& operator[](int index)

{

return data[index];

}

int getLen()

{

return data.size();

}

};

int main()

{

Aggregate<int> * aggr =new ConcreteAggregate<int>();

Iterator<int> *it=aggr->createIterator();

for(it->first();!it->isDone();it->next())

{

cout<<*(it->currentItem())<<endl;

}

delete it;

delete aggr;

return 0;

}

单例模式

   GOOD:保证一个类仅有一个实例,并提供一个访问它的全局访问点

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

class Singelton

{

private:

Singelton(){}

static Singelton* singel;

public:

static Singelton* GetInstance()

{

if(singel == NULL)

{

singel = new Singelton();

}

return singel;

}

};

Singelton* Singelton::singel =NULL;//注意静态变量类外初始化

客户端:

int main()

{

Singelton* s1=Singelton::GetInstance();

Singelton* s2=Singelton::GetInstance();

if(s1 == s2)

cout<<"ok"<<endl;

else

cout<<"no"<<endl;

return 0;

}

桥接模式

   GOOD:将抽象部分与实现部分分离,使它们可以独立变化。

   这里说的意思不是让抽象基类与具体类分离,而是现实系统可能有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出来让它们独立变化,减少它们之间的耦合性,即如果继承不能实现“开放-封闭原则”的话,就应该考虑用桥接模式。如下例:让“手机”既可以按品牌分类也可以

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

//手机软件

classHandsetSoft

{

public:

virtual void Run()=0;

};

//游戏软件

classHandsetGame : public HandsetSoft

{

public:

virtual void Run()

{

cout<<"运行手机游戏"<<endl;

}

};

//通讯录软件

classHandSetAddressList : public HandsetSoft

{

public:

virtual void Run()

{

cout<<"手机通讯录"<<endl;

}

};

//手机品牌

classHandsetBrand

{

protected:

HandsetSoft* m_soft;

public:

void SetHandsetSoft(HandsetSoft* temp)

{

m_soft = temp;

}

virtual void Run()=0;

};

//M品牌

classHandsetBrandM : public HandsetBrand

{

public:

virtual void Run()

{

m_soft->Run();

}

};

//N品牌

classHandsetBrandN : public HandsetBrand

{

public:

virtual void Run()

{

m_soft->Run();

}

};

//客户端

int main()

{

HandsetBrand *brand;

brand = new HandsetBrandM();

brand->SetHandsetSoft(newHandsetGame());

brand->Run();

brand->SetHandsetSoft(newHandSetAddressList());

brand->Run();

return 0;

}

命令模式

   GOOD:一、建立命令队列;二、可以将命令记入日志;三、接收请求的一方可以拒绝;四、添加一个新命令类不影响其它类;

命令模式把请求一个操作的对象与知道怎么操行一个操作的对象分开

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

//烤肉师傅

class Barbucer

{

public:

void MakeMutton()

{

cout<<"烤羊肉"<<endl;

}

void MakeChickenWing()

{

cout<<"烤鸡翅膀"<<endl;

}

};

//抽象命令类

class Command

{

protected:

Barbucer* receiver;

public:

Command(Barbucer* temp)

{

receiver = temp;

}

virtual void ExecuteCmd()=0;

};

//烤羊肉命令

classBakeMuttonCmd : public Command

{

public:

BakeMuttonCmd(Barbucer* temp) :Command(temp){}

virtual void ExecuteCmd()

{

receiver->MakeMutton();

}

};

//烤鸡翅

classChickenWingCmd : public Command

{

public:

ChickenWingCmd(Barbucer* temp) :Command(temp){}

virtual void ExecuteCmd()

{

receiver->MakeChickenWing();

}

};

//服务员类

class Waiter

{

protected:

vector<Command*> m_commandList;

public:

void SetCmd(Command* temp)

{

m_commandList.push_back(temp);

cout<<"增加定单"<<endl;

}

//通知执行

void Notify()

{

vector<Command*>::iteratorp=m_commandList.begin();

while(p!=m_commandList.end())

{

(*p)->ExecuteCmd();

p++;

}

}

};

//客户端

int main()

{

//店里添加烤肉师傅、菜单、服务员等顾客

Barbucer* barbucer=new Barbucer();

Command* cmd= newBakeMuttonCmd(barbucer);

Command* cmd2=newChickenWingCmd(barbucer);

Waiter* girl = new Waiter();

//点菜

girl->SetCmd(cmd);

girl->SetCmd(cmd2);

//服务员通知

girl->Notify();

return 0;

}

责任链模式

   GOOD:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理为止。

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

//请求

class Request

{

public:

string m_strContent;

int m_nNumber;

};

//管理者

class Manager

{

protected:

Manager* manager;

string name;

public:

Manager(string temp)

{

name = temp;

}

voidSetSuccessor(Manager* temp)

{

manager =temp;

}

virtual void GetRequest(Request* request)= 0;

};

//经理

classCommonManager : public Manager

{

public:

CommonManager(string strTemp) :Manager(strTemp){}

virtual voidGetRequest(Request* request)

{

if (request->m_nNumber>=0 && request->m_nNumber<10 )

{

cout<<name<<"处理了"<<request->m_nNumber<<"个请求"<<endl;

}

else

{

manager->GetRequest(request);

}

}

};

//总监

class MajorDomo: public Manager

{

public:

MajorDomo(string name) : Manager(name){}

virtual void GetRequest(Request* request)

{

if(request->m_nNumber>=10)

{

cout<<name<<"处理了"<<request->m_nNumber<<"个请求"<<endl;

}

}

};

//客户端

int main()

{

Manager * common = newCommonManager("张经理");

Manager * major = new MajorDomo("李总监");

common->SetSuccessor(major);

Request* req = new Request();

req->m_nNumber = 33;

common->GetRequest(req);

req->m_nNumber = 3;

common->GetRequest(req);

return 0;

}

中介者模式

   GOOD:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示的相互引用,从而降低耦合;而且可以独立地改变它们之间的交互。

例:

#include <iostream>

#include<string>

#include<vector>

using namespacestd;

class Colleague;

//中介者类

class Mediator

{

public:

virtual void Send(stringmessage,Colleague* col) = 0;

};

//抽象同事类

class Colleague

{

protected:

Mediator* mediator;

public:

Colleague(Mediator* temp)

{

mediator = temp;

}

};

//同事一

class Colleague1: public Colleague

{

public:

Colleague1(Mediator* media) :Colleague(media){}

void Send(string strMessage)

{

mediator->Send(strMessage,this);

}

void Notify(string strMessage)

{

cout<<"同事一获得了消息"<<strMessage<<endl;

}

};

//同事二

class Colleague2: public Colleague

{

public:

Colleague2(Mediator* media) :Colleague(media){}

void Send(string strMessage)

{

mediator->Send(strMessage,this);

}

void Notify(string strMessage)

{

cout<<"同事二获得了消息"<<strMessage<<endl;

}

};

//具体中介者类

classConcreteMediator : public Mediator

{

public:

Colleague1 * col1;

Colleague2 * col2;

virtual void Send(stringmessage,Colleague* col)

{

if(col == col1)

col2->Notify(message);

else

col1->Notify(message);

}

};

//客户端:

int main()

{

ConcreteMediator * m = newConcreteMediator();

//让同事认识中介

Colleague1* col1 = new Colleague1(m);

Colleague2* col2 = new Colleague2(m);

//让中介认识具体的同事类

m->col1 = col1;

m->col2 = col2;

col1->Send("吃饭了吗?");

col2->Send("还没吃,你请吗?");

return 0;

}

享元模式

   GOOD:运用共享技术有效地支持大量细粒度的对象(对于C++来说就是共用一个内存块啦,对象指针指向同一个地方)。

如果一个应用程序使用了大量的对象,而这些对象造成了很大的存储开销就应该考虑使用。

还有就是对象的大多数状态可以外部状态,如果删除对象的外部状态,那么可以用较少的共享对象取代多组对象,此时可以考虑使用享元。

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

//抽象的网站

class WebSite

{

public:

virtual void Use()=0;

};

//具体的共享网站

classConcreteWebSite : public WebSite

{

private:

string name;

public:

ConcreteWebSite(string strName)

{

name = strName;

}

virtual void Use()

{

cout<<"网站分类:"<<name<<endl;

}

};

//不共享的网站

classUnShareWebSite : public WebSite

{

private:

string name;

public:

UnShareWebSite(string strName)

{

name = strName;

}

virtual void Use()

{

cout<<"不共享的网站:"<<name<<endl;

}

};

//网站工厂类,用于存放共享的WebSite对象

class WebFactory

{

private:

vector<WebSite*>websites;

public:

WebSite* GetWeb()

{

vector<WebSite*>::iteratorp = websites.begin();

return *p;

}

WebFactory()

{

websites.push_back(newConcreteWebSite("测试"));

}

};

//客户端

int main()

{

WebFactory* f= new WebFactory();

WebSite* ws= f->GetWeb();

ws->Use();

WebSite* ws2 = f->GetWeb();

ws2->Use();

//不共享的类

WebSite* ws3 = new UnShareWebSite("测试");

ws3->Use();

return 0;

}

解释器模式

   GOOD:通常当一个语言需要解释执行,并且你可以将该语言中的句子表示成为一个抽象的语法树时,可以使用解释器模式。

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

class Context;

classAbstractExpression

{

public:

virtual void Interpret(Context*context)=0;

};

class Expression: public AbstractExpression

{

public:

virtual void Interpret(Context* context)

{

cout<<"终端解释器"<<endl;

};

};

classNonterminalExpression : public AbstractExpression

{

public:

virtual void Interpret(Context* context)

{

cout<<"非终端解释器"<<endl;

}

};

class Context

{

public:

string input;

string output;

};

//客户端

int main()

{

Context* context = new Context();

vector<AbstractExpression*>express;

express.push_back(new Expression());

express.push_back(newNonterminalExpression());

express.push_back(newNonterminalExpression());

vector<AbstractExpression*>::iteratorp = express.begin();

while (p!= express.end())

{

(*p)->Interpret(context);

p++;

}

return 0;

}

访问者模式

   GOOD:适用于数据结构稳定的系统。它把数据结构和作用于数据结构上的操作分离开,使得操作集合

优点:新增加操作很容易,因为增加新操作就相当于增加一个访问者,访问者模式将有关的行为集中到一个访问者对象中

例:

#include<iostream>

#include<string>

#include<vector>

using namespacestd;

class Man;

class Woman;

//行为

class Action

{

public:

virtual void GetManConclusion(Man*concreteElementA)=0;

virtual void GetWomanConclusion(Woman*concreteElementB)=0;

};

//成功

class Success :public Action

{

public:

virtual void GetManConclusion(Man*concreteElementA)

{

cout<<"男人成功时,背后有个伟大的女人"<<endl;

}

virtual void GetWomanConclusion(Woman*concreteElementB)

{

cout<<"女人成功时,背后有个没用的男人"<<endl;

}

};

//失败

class Failure :public Action

{

public:

virtual void GetManConclusion(Man*concreteElementA)

{

cout<<"男人失败时,背后有个伟大的女人"<<endl;

}

virtual void GetWomanConclusion(Woman*concreteElementB)

{

cout<<"女人失败时,背后有个没用的男人"<<endl;

}

};

//抽象人类

class Person

{

public:

virtual void Accept(Action* visitor)=0;

};

//男人

class Man :public Person

{

public:

virtual void Accept(Action* visitor)

{

visitor->GetManConclusion(this);

}

};

//女人

class Woman :public Person

{

public:

virtual void Accept(Action* visitor)

{

visitor->GetWomanConclusion(this);

}

};

//对象结构类

class ObjectStructure

{

private:

vector<Person*>m_personList;

public:

void Add(Person*p)

{

m_personList.push_back(p);

}

voidDisplay(Action* a)

{

vector<Person*>::iteratorp = m_personList.begin();

while (p!=m_personList.end())

{

(*p)->Accept(a);

p++;

}

}

};

//客户端

int main()

{

ObjectStructure * os= newObjectStructure();

os->Add(new Man());

os->Add(new Woman());

Success* success = new Success();

os->Display(success);

Failure* fl = new Failure();

os->Display(fl);

return 0;

}

时间: 2024-10-25 07:56:56

设计模式(四)的相关文章

【白话设计模式四】单例模式(Singleton)

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

大话设计模式(四)单例模式的优与劣

大话设计模式(四)单例模式的优与劣 前言 首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了,比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中我只有一个打印程序的实例.     简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在). 下图是单例模式的结构图. 下面就来看一种情况(这里先假

Java之美[从蛮荒到撬动地球]之设计模式四

其实每个设计模式都是很重要的一种思想,看上去很熟,其实是因为我们在学到的东西中都有涉及,尽管有时我们并不知道,其实在Java本身的设计之中处处都有体现,像AWT.JDBC.集合类.IO管道或者是Web框架,里面设计模式无处不在.因为我们篇幅有限,很难讲每一个设计模式都讲的很详细,不过我会尽我所能,尽量在有限的空间和篇幅内,把意思写清楚了,更好让大家明白.本章不出意外的话,应该是设计模式最后一讲了,首先还是上一下上篇开头的那个图: 本章讲讲第三类和第四类. 19.备忘录模式(Memento) 主要

Java设计模式(四) 之 模板方法模式

源码均以JDK1.8作为参考 1.定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤. 2.解析: 通用类图: 类图解析: 模板方法模式非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式. 2.1.抽象模板(AbstractClass) 主要定义了模板中一些基本操作(方法),它的方法分为两类: 基本方法: 基本方法也叫基本操作,是由子类实现的方法,并且被模板方法被调用. 模板方法: 可以由一个或几个,一般

设计模式四(转载)

在阅读过程中有任何问题,请及时联系:egg.邮箱:[email protected] 微博:http://weibo.com/xtfggef转载请说明出处:http://blog.csdn.net/zhangerqing 其 实每个设计模式都是很重要的一种思想,看上去很熟,其实是因为我们在学到的东西中都有涉及,尽管有时我们并不知道,其实在Java本身的设计之中处处都有 体现,像AWT.JDBC.集合类.IO管道或者是Web框架,里面设计模式无处不在.因为我们篇幅有限,很难讲每一个设计模式都讲的很

设计模式四之工厂模式1

从学习设计模式以来,一直强调接口编程,依赖抽象而不是具体,但是每次看到new出新的对象,是不是就会有些疑问呢?怎么会这样,难道只能这样吗?似乎java中只提供了这种从类中生成对象的方式,不用怀疑,java确实只有这种基础的生成对象的方式,但是我们可以抽象它,使我们的调用代码在更高级的层面上来生成对象,根据不同的业务需求来获取对象. 工厂模式有三种,一种是简单工厂,再有一种是工厂方法,最后一种是抽象工厂. 简单工厂一般都写成静态工厂,如下, package com.csshu.simple; /*

php设计模式 四 (观察者 原型模式 迭代器模式)

观察者模式 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 当一个对象的状态发生改变时,依赖他的对象全部会接到通知,并自动更新.观察者模式实现了低耦合 非入侵式的通知与更新机制. 观察者模式示例: 首先创建一个事

Java设计模式四: 原型模式(Prototype Pattern)

网上找了好多这个模型的资料说的都不透彻,看了半天都是云里雾里.只好自己操刀研究一把. 原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 原型模式中的拷贝分为"浅拷贝"和"深拷贝":浅拷贝: 对值类型的成员变量进行值的复制,对引用类型

设计模式四:观察者,模板方法,命令,状态,职责链条,解释器,中介者,访问者,策略,备忘录,迭代器

1.观察者:Observer 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有 依赖与它的对象都得到通知并被自动更新. 优点: 观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体. 从而使得各自的变化都不会影响另一边的变化. 缺点: 依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者. 适用场景: 当一个对象的改变需要给变其它对象时,而且它不知道具体有多少个对象有待改变时. 一个抽象某型有两个方面,当其中一个方面依赖于另一个方面,这时用观察者模式

设计模式(四)_简单工厂模式

废话不多说,继续学习设计模式的简单工厂模式 简单工厂模式是类的创建模式,又叫静态工厂方法模式.简单工厂模式是由一个工厂对象决定创建哪种产品类实例 使用场景 假如一个应用系统有多种登录方式,比如:用户密码登录.第三方账号登录.那自然建立一个各种登录方式都使用的接口. 下面我针对登录场景,画了uml图 具体代码 1) 接口 public interface Login { public boolean verify(String name,String password); } 2)登录方式的实现