大话设计模式实现C版_第1页
大话设计模式实现C版_第2页
大话设计模式实现C版_第3页
大话设计模式实现C版_第4页
大话设计模式实现C版_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

(-)简单工厂模式…2

(二)策略模式......4

策略与工厂结合…6

单一职责原则……6

开放一一封闭原则6

里氏代换原则7

依赖倒转原则……7

)装饰模式………7

(四)代理模式………9

(五)工厂方法模式

(六)原型模式………

(七)模板方法模式

迪米特法则

(A)外观模式

(九)建造者模式(生成器模式)

(十)观察者模式

(十一)抽象工厂模式............................................................................................................28

(十二)状态模式….31

(十三)适配器模式34

(十四)备忘录模式...........................................................................................................37

(十五)组合模式….39

(十六)迭代器模式,44

(十七)单例模式.…,44

(+A)桥接模式…...........................................................................................................45

(十九)命令模式.…....................................48

(二十)责任链模式.....................................50

(二十一)中介者模式...53

(二十二)享元模式…错误!未定义书签。

(二十三)解释器模式错误!未定义书签。

(二十四)访问者模式错误!未定义书签。

(一)简单工厂模式

主要用于创建对象。新添加类时,不会影响以前的系统代码。核心思想是用一个工厂来

根据榆入的条件产生不同的类,然后根据不同类的virtual函数得到不同的结果。

GOOD:适用于不同情况创建不同的类时

BUG:客户端必须要知道基类和工厂类,耦合性差

(工厂类与基类为关联关系)

例:

〃基类

classCOperation

(

public:

intm_nFirst;

intm_nSecond;

virtualdoubleGctRcsultQ

(

doubledRcsult=0;

returndResult;

}

};

〃加法

classAddOperation:publicCOperation

(

public:

virtualdoubleGctRcsultQ

(

returnm_nFirst4-m_nSccond;

}

};

〃减法

classSubOpcration:publicCOpcration

{

public:

virtualdoubleGetResultO

{

returnm_nFirst-m_nSecond;

)

);

〃工厂类

classCCalculatorFactory-

(

public:

staticCOperation*Create(charcOperator);

};

COpcration*CCalculatorFactonr::Crcatc(charcOpcrator)

(

COpcration*opcr;

〃在C#中可以用反射来取消判断时用的switch,在C++中用什么呢?RTTI??

switch(cOpcrator)

(

case

oper=newAddOperation0;

break;

case',:

opcr=ncwSubOperationQ;

break;

default:

oper=ne\vAddOperationQ;

break;

)

returnopcr;

)

客户端

intmain。

(

inta,b;

cin>>a>>b;

COpcration*op=CCalculatorFactotyziCrcatcf-*);

op->m_nFirst=a;

op->m_nSccond=b;

cout<<op->GetResultO<<:endl;

return0;

(二)策略模式

定义算法家族,分别封装起来,让它们之间可以互相替换,让算法变化,不会影响

到用户

GOOD:适合类中的成员以方法为主,算法经常变动;简化了单元测试(因为每个

算法都有自己的类,可以通过自己的接口单独测试。

策略模式和简单工厂基本相同,但简单工厂模式只能解决对象创建问题,对于经常

变动的算法应使用策略模式。

BUG:客户端要做出判断

策略模式(Strategy)结构图

〃策略基类

classCOperation

(

public:

intm_nFirst;

intm_nSecond;

virtualdoubleGctRcsultQ

(

doubledRcsult=0;

returndResult;

)

};

〃策略具体类一加法类

classAddOpcration:publicCOperation

(

public:

AddOperation(intajntb)

m_nFirst=a;

m_nSccond=b;

}

virtualdoubleGcrRcsultQ

(

returnm_nFirst+m_nSccond;

}

};

classContext

(

private:

COperation*op;

public:

Context(COperation*temp)

{

op=temp;

)

doubleGetResultO

(

returnop->GetResult();

〃客户端

intmain。

{

inta,b;

charc;

cin>>a>>b;

COUtVV”请输入运算符:;

cin>>c;

switch(c)

{

case'+':

Context"context二newContcxt(nc\vAddC)pcration(a,b));

cout<<context->GetResult()<<endl;

break;

default:

break;

return0;

策略与工厂结合

GOOD:客户端只需访问Context类,而不用知道其它任何类信息,实现了低耦合。

在上例基础上,修改下面内容

classContext

(

private:

COperation*op;

public:

Context(charcType)

(

switch(cType)

|

case

op=newAddC)pcration(3,8);

break;

default:

op=newAddOperationQ;

break;

}

}

doubleGetResukO

{

returnop->GetResult();

)

};

〃客户端

intmain()

(

inta,b;

cin>>a>>b;

Context*test=newContext('+);

cout<<tcst->GctRcsuk()<<cndl;

return0;

}

单一职责原则

就一个类而言,应该仅有一个引起它变化的原因。

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削

弱或者抑制这个类完成其它职责能力。这种耦合会导制脆弱的设计,当变化发生时,设计会

遭受到意想不到的破坏。

如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职

责。

开放一一封闭原则

软件实体可以扩展,但是不可修改。即对于扩展是开放的,对于修改是封闭的。面

对需求,对程序的改动是通过增加代码来完成的,而不是改动现有的代码。

当变化发生时,我们就创建抽象来隔离以后发生同类的变化。

开放一一封闭原则是面向对象的核心所在。开发人员应该对程序中呈现出频繁变化

的那部分做出抽象,拒绝对任何部分都刻意抽象及不成熟的抽象。

里氏代换原则

一个软件实体如果使用的是一个父类的话,那么一定适用其子类。而且它察觉不出

父类对象和子类对象的区别。也就是说:在软件里面,把父类替换成子类,程序的行为没有

变化。

子类型必须能够替换掉它们的父类型。

依赖倒转原则

抽象不应该依赖细节,细节应该依赖抽象。即针对接口编程,不要对实现编程。

高层模块不能依赖低层模块,两者都应依赖抽象。

依赖倒转原则是面向对象的标志,用哪种语言编写程序不重要,如果编写时考虑的

是如何针对抽象编程而不是针对细节编程,即程序的所有依赖关系都终止于抽象类或接口。

那就是面向对象设计,反之那就是过程化设计。

(三)装饰模式

动态地给一个对象添加一些额外的职责(不重要的功能,只是偶然一次要执行),就增

加功能来说,装饰模式比生成子类更为灵活。建造过程不稳定,按正确的顺序串联起来进行

控制。

GOOD:当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需

要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功

能),就会增加类的复杂度。装饰模式就是把要添加的附加功能分别放在单独的类中,并让

这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功

能包装对象。

#include<string>

#includc<iostrcam>

usingnamespacestd;

//人

classPerson

(

private:

stringm_strNamc;

public:

Pcrson(stringstrNamc)

(

m_strName=strName;

)

Pcrson(){}

virtualvoidShow。

{

coutvv”装扮的^:"<<m_strName<<endl;

)

);

〃装饰类

classFinery:publicPerson

(

protected:

Person*m_component;

public:

voidDecorate(Person*component)

(

m_component=component;

)

virtualvoidShow。

(

m_component->Show();

)

};

〃丁恤

classTShirts:publicFinery

public:

virtualvoidShow。

(

cout<<"TShirts"vVendl;

m_component->Show();

)

};

〃裤子

classBigTrouser:publicFinery

{

public:

virtualvoidShow。

(

cout«*fBigTrouser**<<endl;

m_component->Show();

)

};

〃客户端

intmainQ

(

Person*p=ncwPerson("小李”);

BigTrouser*bt=newBigTrouser。;

TShirts*ts=ncwTShirtsQ;

bt->Dccoratc(p);

ts->Decorate(bt);

ts->ShowQ;

return0;

}

(四)代理模式

GOOD:远程代理,可以隐藏一个对象在不同地址空间的事实

虚拟代理:通过代理来存放需要很长时间实例化的对象

安全代理:用来控制真实对象的访问权限

智能引用:当调用真实对象时,代理处理另外一些事

代理模式(Proxy)结构图

Proxy类,保存一个引用使得代理可以访问实体,1\

RealSubject类.定义Proxy所代表的真实实体并提供一个与Subject的接口相同的接口,这样

代理就可以用来替代实体

例:

#includc<string>

#include<iostream>

usingnamespacestd;

〃定义接口

classInterface

(

public:

virtualvoidRequest。=0;

};

〃真实类

classRealClass:publicInterface

{

public:

virtualvoidRequest。

{

coutvv”真实的请求"vVendl;

)

};

〃代理类

classProxyClass:publicInterface

(

private:

RealClass*m_rcalClass;

public:

virtualvoidRcquestQ

m_rcalClass=newRcalClassO;

m_realClass->Request。;

deletem_rcalClass;

}

};

客户端:

intmain。

{

ProxyClass*test=newProxyClassf);

tcst->RcquestQ;

return0;

(五)工厂方法模式

GOOD:修正了简单工厂模式中不遵守开放一封闭原则。工厂方法模式把选择

判断移到了客户端去实现,如果想添加新功能就不用修改原来的类,直接修改客户端即可。

工厂方法模式(FactoryMethod)结构图

例:

#include<string>

#includc<iostrcam>

usingnamespacestd;

〃实例基类,相当于Product(为了方便,没用抽象)

classLeiFeng

public:

virtualvoidSweepQ

coutvv”雷锋扫地"vvendl;

}

};

〃学雷锋的大学生,相当于ConcrctcProduct

classStudent:publicLeiFeng

{

public:

virtualvoidSweepO

coutvv”大学生扫地“vVendl;

};

〃学雷锋的志愿者,相当于ConcrctcProduct

classVolenter:publicLeiFeng

{

public:

virtualvoidSweepQ

coutvv”志愿者"vvendl;

);

〃工场基类Creator

classLeiFcngFactory7

public:

virtualIxiFeng*CreateLeiFengQ

returnnewT,eiFengO;

}

};

〃工场具体类

classStuden[Factory:publicLeiFengFactoryr

public:

virtualLeiFeng*CrcatcLciFcngO

{

returnnewStudcntQ;

};

classVolenterFactory-:publicLeiFengFactory

public:

virtualLciFcng^CrcatcLciFcngO

(

returnnewVolenterQ;

}

);

〃客户端

intmain。

(

LciFcngFactoty*sf=ncwLciFcngFactoryO;

LeiFeng*s=sf->CreateLeiFengO;

s->Sweep0;

deletes;

deletesf;

return0;

(六)原型模式

GOOD:从一个对象再创建另外一个可定制的对象,而无需知道任何创建的细

节。并能提高创建的性能。说白了就COPY技术,把一个对象完整的COPY出一份。

原型模式(Prototype)结构图

例:

#includc<iostrcam>

#include<vector>

#includc<string>

usingnamespacestd;

〃抽象基类

classPrototype

private:

stringm_strName;

public:

Prototype(stringstrName){m_strName=strName;}

PrototypeQ{m_strName="}

voidShowQ

(

cout<<m_strName<<endI;

)

virtualPrototype*Clone。=0;

};

//classConcreteProtot\'pel

classConcretePrototype1:publicPrototype

{

public:

ConcrctcPrototyrpcl(stringstrName):Prototypc(strNamc){}

ConcretePrototypel0(}

virtualPrototype*CloneQ

{

ConcretePrototype1*p=newConcreteProtot)pel0;

*p=*this;〃复制对象

returnp;

//classConcretePrototype2

classConcrctcPrototyrpc2:publicPrototype

{

public:

ConcretePrototype2(stringstrName):Prototype(strName){}

ConcrctcPrototyrpc2Q{}

virtualPrototype*CloncQ

ConcretcPrototypc2*p=newConcrctcPrototypc2Q;

*p=*this;〃复制对象

returnp;

〃客户端

intmain。

(

ConcretePrototype1*test=newConcretePrototypel("小王”);

ConcrctcProtot\'pc2*tcst2=(ConcrctcProtot)q3e2*)tcst->Clone0;

test->Show();

test2->Show();

return0;

(七)模板方法模式

GOOD:把不变的代码部分都转移到父类中,将可变的代码用virtual留到子类重写

模板方法模式(TemplateMethod)结构图

Abstractclass

实现了一个模板方法,定义了算法的骨架,L

^,TemplateMethod0具体子类将重定义PrimiliveOperation以

^PrinitiveOperation10实现一个算法的步骤

+PrinitiveOperation20

A-

ConcreteClass

实现Primitiveoperation以完成算法中

与特定子类相关的步骤

•♦PrinitiveOperation10

+PriaitiveOperation20

例:

#include<iostream>

#includc<vcctor>

#include<string>

usingnamespacestd;

classAbstractClass

(

public:

voidShow。

coutvv"我是"vvGetName()vvendl;

protected:

virtualstringGetNamc()=O;

};

classNaruto:publicAbstractClass

{

protected:

virtualstringGctNameQ

(

return"火影史上最帅的六代目---一鸣惊人naruto";

)

};

classOncPicc:publicAbstractClass

{

protected:

virtualstringGetNameQ

{

return"我是无恶不做的大海贼一路飞";

)

);

〃客户端

intmain。

(

Naruto*man=newNarutoQ;

man->ShowO;

OnePice*man2=newOnePiceQ;

man2->ShowQ;

return0;

)

迪米特法则

如果两个类不直接通信,那么这两个类就不应当发生直接的相互作用。如果

一个类需要调用另一个类的某个方法的话,可以通过第三个类转发这个调用。

在类的结构设计上,每一个类都应该尽量降低成员的访问权限。

该法则在后面的适配器模式、解释模式等中有强烈的体现。

(A)外观模式

GOOD:为子系统的一组接口提供一个一致的界面。使用户使用起来更加方便。

外观模式(Facade)结构图

例:

#include<iostream>

#include<string>

usingnamespacestd;

classSubSysOne

(

public:

voidMethodOneO

(

coutvv”方法一H<<endl;

}

};

classSubSysTwo

(

public:

voidMethodTwoO

(

coutvv"方法二"vvendl;

)

);

classSubSysThree

public:

voidMcthodThrecQ

(

coutvv"方法三"vvendl;

}

};

〃外观类

classFacade

(

private:

SubSysOnc*subl;

SubSysTwo*sub2;

SubSysThrcc*sub3;

public:

FacadeQ

(

subl=newSubSysOncQ;

sub2=newSubSysTwoO;

sub3=newSubSysThrccQ;

)

〜Facade。

(

deletesubl;

deletesub2;

deletesub3;

}

voidFacadeMethodO

{

sub!->MethodOne();

sub2->McthodTwoQ;

sub3->MethodThreeQ;

}

};

〃客户端

intmain。

(

Facade*test=newFacade。;

test->FacadeMethod();

return0;

(九)建造者模式(生成器模式)

GOOD:在当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装

配方式时适用。(P115页)

建造者模式(Builder)结构图

具体建造者,实现Builder接口,构造和装配各个部件

例:

#includc<string>

#include<iostream>

#includc<vcctor>

usingnamespacestd;

〃最终的产品类

classProduct

{

private:

vector<string>m_product;

public:

voidAdd(stringstrtemp)

{

m_product.push_back(strtemp);

)

voidShowQ

vector<string>::iteratorp=m_product.begin();

while(p!=m_d())

{

cout<<*p<<cndl;

p++;

)

)

};

〃建造者基类

classBuilder

{

public:

virtualvoidBuilderA。=0;

virtualvoidBuilderBQ=0;

virtualProduct*GctRcsultQ=0;

};

〃第一种建造方式

classConcreteBuilderl:publicBuilder

{

private:

Product*m_product;

public:

ConcreteBuilderl0

(

m_product=newProduct。;

}

virtualvoidBuilderAQ

(

m_product->Add(noncn);

)

virtualvoidBuilderBQ

{

m_product->Add("two");

)

virtualProduct*GctRcsultQ

(

returnm_product;

)

};

〃第二种建造方式

classConcrctcBuildcr2:publicBuilder

(

private:

Product*m_product;

public:

ConcreteBuilder2()

{

m_product=newProduct。;

)

virtualvoidBuilderAQ

{

m_product->Add("A");

)

virtualvoidBuilderBQ

(

m_product->Add("B");

)

virtualProduct*GetResultQ

(

rewrnm_product;

}

};

〃指挥者类

classDirect

(

public:

voidConstructfBuikler*temp)

{

temp->BuilderAQ;

tcmp->BuildcrB();

}

);

〃客户端

intmainQ

(

Direct*p=newDirect。;

Builder*bl=ncwConcrctcBuildcrlQ;

Builder*b2=newConcreteBuilder2();

p->Construct(bl);〃调用第一种方式

Product*pbl=bl->GctRcsult();

pbl->Show();

p->Construct(b2);〃调用第二种方式

Product*pb2=b2->GctRcsult();

pb2->Show();

return0;

例二(其实这个例子应该放在前面讲的):

#includc<string>

#include<iostream>

#includc<vcctor>

usingnamespacestd;

classPerson

{

public:

virtualvoidCreatcHcadQ=0;

virtualvoidCreateHand()=0;

virtualvoidCreatcBodyO=0;

virtualvoidCreateFootQ=0;

);

classThinPerson:publicPerson

{

public:

virtualvoidCreatcHcad()

(

cout<<Hthinhcad"<<endl;

}

virtualvoidCreatcHandQ

{

cout<<nthinhand"<<cndl;

)

virtualvoidCreatcBodyO

(

cout<<HthinbodyH<<cndl;

)

virtualvoidCrcatcFootO

(

cout<<nthinfootn<<cndl;

}

);

classThickPerson:publicPerson

(

public:

virtualvoidCreateHeadO

cout<<nThickPersonhead"VVendl;

virtualvoidCreateHand0

cout<<HThickPersonhandH<<endl;

)

virtualvoidCreateBodyO

|

cout<<HThickPersonbody"Wendi;

}

virtualvoidCreateFootO

{

cout<<HThickPersonfootn<<endl;

}

};

〃指挥者类

classDirect

|

private:

Person*p;

public:

Dircct(Pcrson*temp){p=temp;}

voidCreate。

(

p->CreateHead();

p->CrcatcBodyO;

p->CreateHand();

p->CrcatcFoot();

}

};

〃客户端代码:

intmain。

(

Person*p=newThickPersonQ;

Direct*d=newDircct(p);

d->Create();

deleted;

deletep;

return0;

)

(十)观察者模式

GOOD:定义了一种一对多的关系,让多个观察对象(公司员工)同时监听一

个主题对象(秘书),主题对象状态发生变化时,会通知所有的观察者,使它们能够更新自

己。

«interface»

抽象通知者

+增加(in观察方:抽^观察罚

本少(in观察者:抽象观察荀

+通知0(-

+通知者状态0:string

老板前台

+增加(in观察者:抽象观察荀+增加(in观察者:抽象观察者)

+减少(in观察者:抽象观察知+减少(in观察者:抽象观察耕

+通知0+通知0

,通知者状态0:string+通知者状态0:string

例:

#include<string>

#include<iostream>

#includc<vcctor>

usingnamespacestd;

classSecretary;

〃看股票的同事类(观察对象,观察者)

classStockObserver

{

private:

stringname;

Secretary*sub;

public:

StockObsen-er(stringstrname,Secretary*strsub)

(

name=strname;

sub二strsub;

}

voidUpdateQ;

};

〃秘书类(主题对象,通知者)

classSecretary

{

private:

vector<StockObserver>observers;

public:

stringaction;

voidAdd(StockObserverob)

obsenrers.push_back(ob);

voidNotifyO

{

vector<StockObservrer>::iteratorp=observers.beginQ;

while(p!=observers.end())

(

(*p).UpdatcQ;

p++;

)

}

};

voidStock()bserver::Update()

{

cout<〈namc<<":"<<sub->action<<",不要玩股票了,要开始工作了"<<cndl;

}

〃客户端

intmain。

{

Secretary*p=ncwSccrctaryQ;//创建通知者

〃观察者

StockObservcr*sl=newStockObserver("小李",p);

StockObserver*s2=newStockObserver("小赵”,p);

〃加入通知队列

p->Add(*sl);

p->Add(*s2);

〃事件

p->action二"老板来了”;

〃通知

p->NotifyO;

return0;

观察者模式(Observer)结构图

例:

#includc<string>

#include<iostream>

#include<vector>

usingnamespacestd;

classSecretatyBase;

〃抽象观察者

classCObserverBase

(

protected:

stringname;

Secretan-Base*sub;

public:

CObserv?erBase(stringstrname,Secretar\-Base*strsub)

(

name=strname;

sub=strsub;

}

virtualvoidUpdate。=0;

);

〃具体的观察者,看股票的

classStockObsenrer:publicCObserverBase

public:

StockObscrvrcr(stringstrnamc,SccrctatyBasc*strsub):C()bscr\^crBase(strnamc,strsub)

virtualvoidUpdate。;

};

〃具体观察者,看NBA的

classNBAObserver:publicCObservrerBase

(

public:

NBAObscr\rcr(stringstrnamc,Sccrctary'Basc*strsub):CC)bscn-crBasc(strnamc,strsub){}

virtualvoidUpdate。;

);

〃抽象通知者

classSccrctatyBasc

(

public:

stringaction;

vcctor<CObscrvrcrBasc*>observers;

public:

virtualvoidAttach(CObserverBase*observer)=0;

virtualvoidNotifyO=0;

};

〃具体通知者

classSecretary:publicSecretaryBase

(

public:

voidAttach(CObservrerBase*ob)

(

observers.push_back(ob);

)

voidNotifyQ

(

vector<CObserverBase*>::iteratorp=observers.beginQ;

while(p!=obsenrers.end())

(

(*p)->Update();

P++;

}

};

voidStockObserxrer::Update()

{

coutvvnamevv":"vvsub->actionvv",不要玩股票了,要开始工作TH«endl;

)

voidNBAObser\rer::UpdateO

{

coutvvnamevv":"vvsub->actionvv",不要看NBA了,老板来了"v〈endl;

客户端:

intmainQ

(

Sccrctary^Base*p=ncwSecretary。;〃创建观察者

//被观察的对象

CObsen-erBase*sl=newNBAObserver(“小李”,p);

CObserverBase*s2=newStockObserver。'小赵",p);

〃加入观察队列

p->Attach(sl);

p->Attach(s2);

〃事件

p->action二"老板来了”;

〃通知

p->NotifyO;

return0;

(十一)抽象工厂模式

GOOD:定义了一个创建一系列相关或相互依赖的接口,而无需指定它们的具

体类。

用于交换产品系列,如ACCESS->SQLSERVER;

产品的具体类名被具体工厂的实现分离

例:

#include<string>

#includc<iostrcam>

#include<vector>

usingnamespacestd;

〃用户抽象接口

classlUser

{

public:

virtualvoidGctUscr()=0;

virtualvoidInsertUser()=O;

);

〃部门抽象接口

classIDepartment

(

public:

virtualvoidGctDcpartmcnt()=O;

virtualvoidInsertDepartmentO=0;

};

//ACCESS用户

classCAccessUser:publiclUser

{

public:

virtualvoidGetUserQ

(

cout<<HAcccssGctUser"<<endl;

}

virtualvoidInsertUserQ

(

cout<<HAccessInsertUserM<<endl;

)

};

//ACCESS部门

classCAccessDepartment:publicIDepartment

(

public:

virtualvoidGctDcpartmcntO

(

cout<<HAcccssGctDcpartment"<<endl;

)

virtualvoidInscrtDcpartmentQ

cout<<HAcccssInscrtDcpartmcntH<<cndl;

};

//SQL用户

classCSqlUser:publiclUser

{

public:

virtualvoidGctUscrQ

(

cout«MSqlUserH«endl;

}

virtualvoidInsertUscrQ

(

cout«nSqlUsern<<endl;

)

);

〃SQL部门类

classCSqlDepartment:publicIDepartment

(

public:

virtualvoidGctDcpartmcntO

(

cout<<**sqlgetDepartmentH<<endl;

}

virtualvoidInscrtDcpartmentQ

(

cout<<nsqlinsertdepartment"<<endl;

)

};

〃抽象工厂

classIFactoty

(

public:

virtuallUser*CrcatcUscr()=O;

virtualIDepartment*CreateDepartmentO=0;

);

//ACCESS工厂

classAccessFactory:public【Factory

(

public:

virtuallUser*CrcateUscrO

returnnewCAccessUscrQ;

virtualIDcpartmcnt*CrcatcDcpartmcntO

(

returnnewCAcccssDcpartmcntO;

}

);

//SQL工厂

classSqlFactory:publicIFactory

(

public:

virtuallUscr*CrcateUscrQ

(

returnnewCSqlUscrQ;

)

virtual(Department*CreateDepartmentQ

(

returnnewCSqlDepartmentO;

)

};

客户端:

intmain。

(

IPacton*factory=newSqlFactoryQ;

lUser*user=factoty->CreateUserQ;

IDepartment*depart=factoty->CreateDepartmentO;

user->GetUser();

depart->GetDepartment();

return0;

)

(十二)状态模式

GOOD:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态

改变它的行为时,可考虑用到状态模式。

#include<iostream>

usingnamespacestd;

classWork;

classForcnoonStatc;

classNoonState;

classState

(

public:

virtualvoidWriteProgram(VCork*w)=0;

);

classWork

{

private:

State*current;

public:

doublehour;

public:

WorkQ;

voidSetState(State*temp)

{

current=temp;

}

voidWrireprogram0

current->WriteProgram(this);

);

classNoonStatc:publicState

(

public:

virtualvoidWriteProgram(Work*w)

|

cout<<nexecuten<<endl;

if((\v->hour)<13)

coutvv"还不错啦"〈Vendl;

else

coutvv”不行了,还是睡觉吧"vVendl;

}

};

classForenoonState:publicState

{

public:

virtualvoidWritcProgram(Work*w)

(

if((w->hour)<12)

coutvv”现在的精神无敌好”<Vendl;

else

{

w->SetState(newNoonStateQ);

w->Writeprogram();〃注意加上这句

}

)

};

Work::WorkO

{

current=newForenoonStateO;

}

客户端:

intmainQ

(

Work*my\vork=newWorkQ;

mywork->hour=9;

mywork->Wrireprogram0;

mywork->hour=14;

mywork->Writeprogram0;

return0;

(十三)适配器模式

GOOD:双方都不适合修改的时候,可以考虑使用适配器模式

适配器模式(Adapter)结构图

例:

#includc<iostrcam>

usingnamespacestd;

classTarget

(

public:

virtualvoidRcquestQ

(

coutvv”普通的请求“vvcndl;

}

);

classAdaptce

(

public:

voidSpecificalRequest。

(

coutvv”特殊请求"vVendl;

}

};

classAdapter:publicTarget

pnvate:

Adaptec*ada;

public:

virtualvoidRequest。

(

ada->SpccificalRcquestQ;

Target::Request();

}

AdapterO

(

ada=newAdapteeQ;

)

〜Adapter。

(

deleteada;

客户端:

intmain。

(

Adapter*ada=ncwAdapter。;

ada->Request();

deleteada;

return0;

)

例二

#include<iostream>

#includc<string>

usingnamespacestd;

classPlayer

{

protected:

stringname;

public:

Player(stringstrName){name=strNamc;}

virtualvoidAttack0=0;

virtualvoidDefense。=0;

};

classForwards:publicPlayer

public:

For\vards(stringstrName):Playcr(strNamc){}

public:

virtualvoidAttack。

(

cout«name<<11It锋进攻"vvcndl;

)

virtualvoidDcfcnscQ

(

coutvvnamevv"前锋防守"vvendl;

)

);

classCenter:publicPlayer

{

public:

Center(stringstrName):Player(strName){}

public:

virtualvoidAttack0

(

cout<<nam

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论