




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如果把修习软件开发当做武 的话,那么可以分为招式和内功内 招 Eclipse、VisualStudio等开发工具;Struts、Hibernate、JBPM等框内功:数据结构、算法、设计模式、重构、软件工每一位软件开发人员也都希望成为一名兼具淋漓招式和深厚内功的“上你日益纯“招式”,你的软件“功力”一定会达到一个新的境界。招招式可以很快学会,但是内功 需要更长的时间
“模式之父ChristopherChristopher.)———哈佛博士 加州大学伯克利分校建筑学教授、加州大学伯克利分校环境结构究、艺术◦的解决方案的——《建筑的永恒之道》byChristopherChristopherAlexander在《建筑的永恒之道》中给出了设计模式的定义,的解决方案。”(设计模式的定义四人组(GangofFour),简称RalphJohnson,RichardHelm,ErichG ,JohnVli GoF将模式的概念引入软件工程领域,这标志着软件模式的诞生。软发的总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括架构在着一些被认同的模式。软件模式与具体的应用领域无关,也就是说无论你从事的是移动应用开发、桌面应用开发、eb应用开发还是嵌入式软件的开发,都可以使用软件模式。无论你是使用、C#、bjtveC、.nt、Satak等纯面向对象编程语言,还是使用C++、PP、eph、aaSrpt等可支持面向对象编程的语言,你都需要了解软件设计模式!“软件设计模式(“软件设计模式(intt)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码GoF设计模式有23个,包括创创建型(Creational)模式:如何结构型(Structural)模式:如何实现类或对行为型(Behavioral)模式:类或对象怎样交互以及怎样分配职责有一个“简单工厂模式”不属于GoF23种设计模式,但大部分的设计模式设设计模式目前种类:GoF的23 +“简单工厂模式”=24种学者来说,学习设计模式将有助于更加深入地理解面向对象思想,让你知道:如何将代码分散在几个不同的类中为什么要有“接口何谓针对抽象编程何时不应该使用继承如果不修改源代码增加新功能更好地阅读和理解现有类库与其他系统中的源代码学学习设计模式会让你早点脱离面向对象编程的“菜鸟期”设计模式的基础是:多态初学者:积累案例,不要盲目的背类临界点的突破,不要浮躁。多应用,对经典则组合设计模式的大量,自由的运用。要不断的追求。 点 显示的相用,从而使其耦合性松散,而且可以独立的改变他们之间对于面向对象软件系统的设计而言,在支持可性的同时,提高系统的可复用性是一个至关重要的问题,如何同时提高一个软件系统的可性和可复用性是面向对象设计需要解决的问题之一。在面向对象设计中,可面向对象设计原则为支持可性复用而诞生,这些原则蕴含在很多设计模式中,它们是从许多设计方案中总结出的指导性原则。面向对象设计原则也原原则的目的:高内聚,低耦名定单一职责(Single类的职责单一,对外只提供一种功能,而引起类Principle,化的原因都应该只有一个类的改动是通过增加代码进行的,而不是修改源码Principle,LSP依赖倒转(Dependence依赖于抽象(接口),不要依赖具体的实现(类),也Principle,是针对接口编程Principle,ISP合成复用迪法(LawofDemeter,要了解另外一个模块的内部实现细节,这样当一模块内部的实现发生改变时,不会影响其他模块使用。(黑盒原理#include#includeusingnamespaceclass{voidsave()cout"存款}voidtransfer()cout"转账}voidpay()cout"交费}9intint{BankWorker*bw=newBankWorker;bw-return0;}以上对银行业务员类(akWr是改动ankokr,#incluo
这段代码符合开闭原则usingnamespaceclass{/**/virtualvoiddoBusiness()=0;classsaveBankWorker:public{virtualvoidcout"存款}classtransBankWorker:public{virtualvoidcout"转账}classpayBankWorker:publicvirtualvoiddoBusiness(cout<<"付款"<<endl;}classfundBankWorker:public{virtualvoiddoBusiness(){cout"基金办理endl;}}int{saveBankWorkerAbBankWorkerdoBusinessAbBankWorker*abw=NULL;abw=newsaveBankWorker;deleteabw;abw=abw=newtransBankWorker;deleteabw;abw=abw=newpayBankWorker;deleteabw;abw=abw=newfundBankWorker;deleteabw;abw=return}而是通过拓展添加类的方式来搞定,实际上是利用了多态的特性,这样就符合了开闭原则。#include#includeusingnamespacestd;classAbBankWorker{/**/virtualvoiddoBusiness()=0;classsaveBankWorker:public{virtualvoidcout"存款}classtransBankWorker:public{virtualvoidcout转账}classpayBankWorker:public{virtualvoidcout付款} 业务层,依赖于接口AbBankWorkervoiddoBusiness(AbBankWorker*abw){abw--}//AbBankWorkervoidprintAllWorker(){AbBankWorker*abw=NULL;abw=newsaveBankWorker;deleteabw=newtransBankWorker;deleteabw=newpayBankWorker;deleteabw=newfundBankWorker;delete}int{return0;}传统的设计模式通常是自顶向下逐级依赖,这样,底层模块,中间层模块和模块的耦合度极高,若任意修改其中的一个,很容易导致全面积的改,非常麻烦,那么依赖倒转原则利用多态的特性,对中间抽象层进行赖,这样,底层和之间进行了合。下面我们继续看一个符合依赖倒转原则的例子,这里是一个组装电脑的案例,硬盘,P,内存第三厂商均可以进行对接,但是电脑生产公司只是对外提供抽象中间层接口,第厂商想要加入只需要面向这个抽象类实现各自的实例就可以了。#include<iostream>usingnamespacestd;抽象层class{virtualvoidwork()=class{virtualvoidwork()=class{virtualvoidwork()=让Computerclass{Computer(Cpu*cpu,Memory*mem,HardDisk{this->cpu=cpu;this->memory=mem;this->harddisk=hard;} voidwork()cpu-memory-harddisk-}HardDisk*harddisk=NULL;Memory*memory=NULL;Cpu*cpu=NULL;classXiJieHardDisk:public{virtualvoidwork()cout"希捷硬盘工作中}class Cpu:public{publicvirtualvoidwork()cout CPU工作中}classJSDMemory:public{virtualvoidwork()cout 内存工作中}intmain(void)XiJieHardDisk*xjhard=newXiJieHardDisk; Cpu*in cpu=newIn JSDMemory*jsdmem=newJSDMemory;Computerputer=new cpu,jsdmem,deletexjhard;deletein deletejsdmem; return}迪法和陌生人说不和陌生人说与依赖倒转原则结合和抽象陌生人说话让和陌生人进行耦简单工厂模式并不属于GoF的23种设计模式#inclue<iostream要用工厂模式呢?请看下面的一段程序usingnamespaceclass{Fruit(string{this->name=if(name=="apple")}elseif(name=="banana")//2}elseif(name=="pear")//3}}voidgetName()if(name=="apple")cout"我是苹果}elseif(name==cout"我是香蕉<<}elseif(name==cout"我是鸭梨<<}}intkind;int{Fruitapple=return}不难看出,Fruit类是一个“巨大的”类,在该类的设计中存在如下几个问题在Frut类中包含很多“fse代码越长,阅读难度、难度和测试难度也越大;而且大量条件语句的存在Frut果对象的初始化代码和显示代码集一个类中实现,了“单一职责原则”,不利于类的重用和;当需要增加新类型的水果时,必须改rut类的代码,了“开闭原则”。工厂(Fatoy)角色:简单厂模式,它负责实现创建所有实抽象产品( Podut)角色简单工厂模式所创建的所有对象父类,它负责描述所有实例所共有共接口。具体产品(ConcreteProduct)角色:简单工厂模式所创建的具体实例#include#includeusingnamespaceclass{virtualvoidgetName()=classApple:public{publicvirtualvoidgetName()cout"我是苹果}classBanana:public{virtualvoidgetName()cout"我是香蕉}classPear:public{virtualvoidgetName()cout我是鸭梨}class{publicFruit*createFruit(string{if(name=="apple"){returnnewApple;}elseif(name=={returnnew}elseif(name=={returnnew}}int{Factory*factory=newFactory;Fruit*fruit=NULL;fruit=factory->createFruit("apple");deletefruit;fruit=fruit=factory->createFruit("banana");deletefruit;fruit=fruit=factory->createFruit("pear");deletefruit;fruit=return0;}优优点实现了对象创建和使用的分离不需要记住具体类名,记住参数即可,减少使用量缺点对工厂类职责过重,一旦不能工作,系统受到影响增加系统中类的个数,复杂度和理解度增加“开闭原则”,添加新产品需要修改工厂逻辑,工厂越来越复杂方法中的业务逻辑太过复杂。客户端只知道传入工厂类的参数,对于如何创建对象并不关心抽象工厂( Factory)角色:工厂方法模式的,任何工厂都必须实现这个接口。工厂(ConcreteFactory)角色:具体工厂类是抽象工厂的一个实现,抽象产品( Produt)角色:工厂方法模式所创建的所有对的父类,它负责描述所有实例所共公共接口。具体产品(ConcreteProduct)角色:工厂方法模式所创建的具体实例对象简简单工厂模式+“开闭原则” 工厂方法模#include#includeusingusingnamespaceclass{virtualvoidgetName()= {virtualFruit*createFruit()=classApple:public{virtualvoidgetName()cout"我是苹果}classBanana:public{virtualvoidgetName()cout"我是香蕉}classAppleFactory {virtualFruit*{returnnew}classBananaFactory: {virtualFruit{returnnew}classPear:public{virtualvoidgetName()cout我是鸭梨}classPearFactory: {virtualFruit{returnnew}int{Factory*abFactory=Fruit*fruit=抽象类指针,完成AppleabFactory=newAppleFactory;fruit=abFactory->createFruit();deletefruit;抽象类指针,完成抽象类指针,完成BananaabFactory=newBananaFactory;deletefruit;抽象类指针,完成BananaabFactory=newPearFactory;deletefruit;return}优优点不需要记住具体类名,甚至连具体参数都不实现了对象创建和使用的分离◦3.系统的可扩展性也就变得非常好,无需修改接口和原类缺点增加系统中类的个数,复杂度和理解度增加增加了系统的抽象性和理解难度客户端不知道它所需要的对象的类抽象工厂类通过其子类来指定创建哪个对象工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是我们本当我们想添加一个新产品的时候,比如葡萄,虽然不用修改代码,但是我们需要添加大量的类,而且还需要添加相对的工厂。(系统开销,成如果我们使用同一地域的水果( , , ),那我们需要分别创建具体的工厂,如果选择出现,将会造成,虽然可以加一些约束,但是代码实现变得复。抽象工厂( Factory)角色:它了一组用于创建一族产品的方法,每一个方法对应一种产品。具体工厂(ConteFactory)角色:它实现了在抽象工厂中的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。抽象产品( Produt)角色:它为每种产品接口,在抽象产品中了产品所具有的业务方。具体产品(ConteProdut)角色:它定义具体工厂生产的具体产品对象,实现抽象产品接口中的方法。#include<iostream>usingnamespacestd; Apple{publicvirtualvoidgetName()= {cvirtualvoidgetName()= Apple: {virtualvoidgetName()cout中国苹果}classUSAApple: {publicvirtualvoidgetName()cout 苹果} Banana: {publicvirtualvoidgetName()cout中国香蕉}classUSABanana: {virtualvoidgetName()cout 香蕉} Factory{ Apple*createApple()= Banana*createBanana()= Factory: {Apple*{return} Banana*{return }classUSAFactory: { Apple*{returnnew} Banana*{returnnew}int{Apple*apple=NULL;Banana*banana=NULL;factory=apple=factory--banana=factory->createBanana();banana--deleteapple;deletebanana;return}思思考:抽象工厂模式是否符合“开闭原则优优点拥有工厂方法模式的优始终只使用同一个产品族中的对象。 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”缺点1.增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需系统中有多于一个的产品族。而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产构或者删除已有的产品等级结构。作作业 y,功能实现只要打印出意义即可),内存具有存现有In 厂商nda厂商,Kngt厂商,均会生产以上三种硬件要求组装两台电脑,1台1台用抽象工厂模式实现的的显卡 的内存的CPU,nvidia的显卡,Kingston的内存保保证一个类、只有一个实例存在,同时提供能对该实例加方法的全(GoF给出单例模式的定义三三个要点三是它必须自行向整个系统提供这个实例Sngtn(单例)tIsan工厂方法,客户可以它的唯一实例;为了止Sngtn单单例模式的使用步骤构造函◦提供一个全局的静态方法(点)来获取单例对象在类中定义一个静态指针,指向本类的变量的静态变量指针#include<iostream>usingnamespacestd;class{staticSingelton*getInstance():if(instance=={instance=new}}int{return}Singelton()instance=NULL;m_count=0;coutsingelton()执行}staticSingelton*instance;staticintm_count;Singelton*Singelton::instance=NULL;intSingelton::m_count=0;classSingelton2staticSingelton2*{m_count++;returninstance;}int{return}{instance=NULL;m_count=0;}staticSingelton2*instance;staticintm_count;而是不管你创不创建实例,我在的Singelton2*Singelton2::instance=newSingelton2;intSingelton2::m_count=0;int{Singelton*singer=Singelton::getInstance();cout<<singer->getCount()<<endl;Singelton*singer2=Singelton::getInstance();cout<<singer2->getCount()<<endl;if(singer==singer2)cout二者是同一个实例}elsecout二者不是同一个实例}cout<<"----------以下是饿汉式------------"<<Singelton2*singer3=Singelton2::getInstance();cout<<singer3->getCount()<<endl;Singelton2*singer4=Singelton2::getInstance();cout<<singer4->getCount()<<endl;if(singer3==singer4)cout二者是同一个实例}elsecout二者不是同一个实例}return}容,并且可以累 使用次思思考当单例模式中的懒汉模式遇见多线程,改怎么办优优点(1)单例模式提供了对唯一实例的受◦(2)节约系统资源。由于在系统内存中只存在一个对象缺点扩展略难。单例模式中没有抽象层单例类的职责过重客户调用类的单个实例只允许使用公共点,除了该公共点,不能通过其他途径该实例。让让类和类进行组合,获得更大的结构模式叫做模式,是构型设计模式之一,它可以为其他对提供一种()以控制对个象的。所谓,是指具有与元(被的对象)具有相同的接口的类,客户端必须通过与被的目标类交互,而一般在交互的过程中(交 角色):含有对真 角色 ,角色通常将客户端调用传递给真是 对象或者之后执行某些操作,而不是单回真实的对象。#include#include#include<string>usingnamespacestd;class{Item(stringkind,bool{this->kind=kind;}boolfact;class{virtualvoidbuy(Item&item)=class :public virtualvoidbuy(Item&item)cout去韩国进行了购物买了item.kind} class :public{virtualvoidbuy(Item&item)cout<<" 进行了购物,买了"<<item.kind<<}class :public{virtualvoidbuy(Item&item)cout去非洲进行了购物买了item.kind} 而且增加了办理护照和货 安检等具体业务class :public{ * {this->shopMode= } ()deletethis--}//virtualvoidbuy(Item&item){if(distinguish(item)==true)}elsecout<<"发现伪货["<<item.kind<<"],不 "<<}}booldistinguish(Item&item)cout对物品<<item.kind<<"]辨别真伪endl;returnitem.fact;}} voidcheck(Item&item)cout<<"通 安检,带回国内"<<}*int{Itemt1("化妆品",true);Itemt2("CET4 ",false);Itemt3("addass运动鞋" ===new(new;//2 买=new(new //3去非洲买=new(new return}(Remote):为一个位于不同的地址空间的对象提供一个本地的对象,这个不同的地址空间可以是在同一台主机中,也可是在另 虚拟(Virtual):如果需要创建一个资源消耗较大的对象,先保护(Protect):控制对一个对象的,可以给不同的用缓冲(Cache):为某一个目标操作的结果提供临时的空智能(SmartReference):当一个对象被时,提供优优点能够协调调用者和被调用者,在一定程度上降低了系统的耦(2)客户端可以针对抽 角色进行编程,增加和更 类无须修改代码,符合开闭原则,系统具有较好的灵活性和可扩展性缺点为其他对象提供一种以控制对这个对象的oorr就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。Copot(抽象构件):它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理pot(具体构件):它是抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中的方法,装饰器可以给它增加额外的职责(方法)。tr(抽象装饰类):它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现。它一个指向抽象构件对象的引通以用之构件的,过子展方法以达到装饰的目的。Conrtortr(具体装饰类):它是抽象装饰类的子类,负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在#include<string>usingnamespacestd;class{virtualvoidshow()= :public{(string{this->kind=}virtualvoidshow()cout<<"秀出 -"<<kind<<":"}stringclassMi:public{Mi(string{this->kind=}virtualvoidshow()}stringclassMi:public{Mi(string{this->kind=}virtualvoidshow()}string classDecoratorPhone:public{DecoratorPhone()}{this->phone=}virtualvoid{this->phone-}PhoneclassDecoratorPhoneMo:public{*phone){this->phone=}virtualvoid{this->phone->show();}voidAddMo()cout<<"装饰 贴膜"<<}PhoneclassDecoratorPhoneTao:public{*phone){this->phone=}virtualvoid{this->phone->show();}voidAddTao()cout<<"装饰 外套"<<}Phoneint{Phone*phone=NULL;DecoratorPhone*hasMophone=NULL;DecoratorPhone*hasTaophone=NULL;DecoratorPhone*hasMoTaophone=NULL; 6phone= ("6 hasMophone=new hasTaophone=newDecoratorPhoneTao(phone);hasTaophone-- hasMoTaophone=newDecoratorPhoneMo(hasTaophone);deletehasTaophone;deletehasMophone;deletephone;phone=new//给普通小米4shasMophone=new//给普通小米4shasTaophone=newDecoratorPhoneTao(phone);hasTaophone--hasMoTaophone=newDecoratorPhoneTao(hasMophone);deletehasTaophone;deletehasMophone;deletephone;return}优优点急剧增加。可以通过一种动态的方式来扩展一个对象的功能,从而实现不同的行可以对一个对象进行多次装饰缺点使用装饰模式进行系统设计时将产多小对象,大量小对象的产生势必占用 的系统资源,影响程序的。4.2.3适用场景动态、透明的方式给单个对象添加职和时可以使用装饰模式。换句话说,用模式,类(lass)可以对它的客根据迪法则,如果两个类不必直接通信,那么这两个类就不当发生直接的相互作用。Fce模式也叫外观模式,由o种设计模式中的一种。Fcefae。Façde外观角色):为调用方, 义简单的调用接口。Suyt(子系统角色:能提供。指提供功能的类群(模块或子#include<iostream>usingnamespacestd;classSubSystem1{void{}class{void{}class{void{}class{void{}class{SubSystem1*one;SubSystem2*two;SubSystem4*four;{one=newSubSystem1();two=newSubSystem2();three=newSubSystem3();four=newSubSystem4();}{deleteone;deletetwo;deletefour;}void{two--}void{four--} void{Facadefacade;}练练习根据类图,实现家庭影院外观模式应实现优优点(1)它对客户了子系统组件,减少了客户端所需处理的对象数目,使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很单,与之关联的对象也很少。 做太多的限制则减少了可变性和灵活性。如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背开闭原则复杂系统需要简单使用客户端程序与多个子系统之间存在很大的依赖性在层次化结构中,可以使用外观模义系统中每一层的,层 <———— 适配 <————>age(目标抽象类)象类或接口,也可以是具体类。Adapter(适配器类):适配器可以调用另一个接口,作为一个转器,对Adat和agt进行适配配器类是适配器模式的,在对适配器中,它通过继承atAdateAdate(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。方法,而适配者类Adpesfttr,reqstfReqt(#include<iostream>#include<iostream>usingnamespacestd;class{virtualvoiduseV5()=//class{virtualvoiduseV220()cout用220V电压进行充电}AdapterclassChargerAdapter:public{virtualvoiduseV5()coutendl;}V220Phone{public:Phone(){v5Adapter=new}~Phone()if(v5Adapter!={delete}}voidcharge()cout<<" 进行充电endl;} V5int{ return}优优点将目标类和适配者类解耦类,无须修改原有结构。增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类类可以在多个不同的系统中复用。灵活性和扩展性都非常好缺点适配器中置换适配者类的某些方法比较麻烦(如方法名)用来对类或对象怎样交互和怎样分配职责进行描Css():Prtrtos),法teMthd,用于定义一个算ConrtCss(具体子类):它是抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。#include#includeusingnamespaceclassBeverage{voidBoilWater()cout"烧开水}冲泡特殊接口virtualvoidBrew()=voidPourInCup()cout"倒入杯中}virtualvoidAddCondiments()=hookvirtualbool{return}void{if{}}classCoffee:public{virtualvoidBrew()cout冲泡咖啡豆}virtualvoid{t}classTea:public{virtualvoidBrew()cout冲泡茶叶}virtualvoid{cout<<"添加柠檬"<<}int{Beverage*pTea=newTea;deletepTea;cout<<"---------------------"<<Beverage*pCoffee=newCoffee;deletepCoffee;return}优点模板方法模式是一种代码复用技术,它在类库设计中尤为重要,它提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行定步骤是否需要执行。在模板方法模式中可以通过子类来覆盖父类的基本方法,不同的子类可以提供基本方法的不同实现,更换和增加新的子类很方便,符合单一职责原则和开闭原则。缺点具有统一的操作步骤或操作过具有不同的操作细将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参Atonrnacton圈命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接关系,发送请求的对象只需要知道如何发送请求,而不必知道如完成请求。圈亲自找医生看填圈 病 医#include<iostream>usingnamespacestd;class{voidtreat_eye()cout}voidtreat_nose()cout}//class{{m_doctor=}voidtreat()m_doctor--}Doctor//class{{m_doctor=}voidtreat()m_doctor--}Doctorint{//1Doctor*doctor=newDoctor;cout<<"--------------"<<//2Doctor*doctor_1=newCommandTreatEye*cmdTreatEye=newdeleteCommandTreatNose*cmdTreatNose=newCommandTreatNose(doctor_1);deletereturn0;}圈病情告知护
护士统计编写病
批量发送给医Comand(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中了用于执行请求的eu等方法,通过这些方法可以调用请求接收者的相关操作。对象的动作绑定其中。在实现execute()方法时,将调用接收者对象的相关(Actionnoe(调用者):调用者即请求发送者,它通过命令对象来执行请命令对象的euRer接收者):求的业务处理。#include#include#include<list>usingnamespacestd;class{voidtreat_eye()cout"}voidtreat_nose()cout"}class{Command(Doctor{this->doctor=}virtualvoidtreat()=0;DoctorclassCommandTreatEye:publicCommand{public:CommandTreatEye(Doctor*doctor):virtualvoid{}classCommandTreatNose:public{CommandTreatNose(Doctor*doctor):Command(doctor)virtualvoid{}classNurse{Nurse(Command*{this->command=}//(病单)并且执行.voidNotyfy(){command--}Command//class{AdvNurse()} mand(Command{}//(病单)并且执行.voidNotyfy(){ for(list<Command*>::i torit=cmd_list.begin(); it!=cmd_list.end();it++){(*it)--}}}list<Command*>int{Doctor*doctor=newCommand*command_1=newCommandTreatEye(doctor);Command*command_2=newCommandTreatNose(doctor);AdvNurse*advNurse=newAdvNurse;advNurse-advNurse-delete//Nurse*nurse=new//nurse--//deletedeletecommand_1;deletecommand_2;deletedoctor;return}练练习联想路边撸串烧烤场景,有烤羊肉,烧鸡翅命令,有烤串师傅,和服务优优点(1)降低系统的耦合度。由于请求者与接收者之间不存在直,因此求者与接收者之间实现完全解耦,相同的请求者可以对应不同的接收者,同相同的接收者也可以供不同的请求者使用,两者之间具有良好的独立性新令可以很容易地加入到系统中。响到其他类,因此增加新的具体命令类很容易,无须修改原有系统源代码,甚(组合命令)使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个对请求接收者的调用操作都需要设计一个具体命令类,因此在某些系统中可能需要提供大量的具体命令类,这将影响命令模式的使用系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。请求调用者无须知道接收者的存在,也无须知道接收者是谁,接收者也无须关心何时被调用。系统需要在不同的时间指定请求、将请求排队和执行请求。一个命令对象和请求的初始调用者可以有不同的生命期,换言之,最初的请求发出者可能已经不在了,而命令对象本身仍然是活动的,可以通过该命令对象去调用请求接收者,而无须关心请求调用者的存在性,可以通过请求日志文件等机制来具体实现。系统需要将一组操作组合在一起形成宏命令Cott(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。Sr(抽象策略类):它为支的算法了抽象方法,是所有略类中的方法在运行时调用具略类中实现的算法。ConrtStay(具体策略类):它实现了在抽象策略类中的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。#include#includeusingnamespaceclass{virtualvoiduseWeapon()=策略1-使用AK47classAK47:public{virtualvoiduseWeapon()cout<<"UseAK47toshoot!"<<}策略2-使classKnife:public{virtualvoiduseWeapon()cout<<"UseKnifetokill"<<}//相当于Contextclass{voidsetWeapon(WeaponStrategy{wStrategy=}voidfight()wStrategy--}WeaponStrategyclass{void{}Knifeclass {void{}AK47int{ CharacterKnife*c1=newCharacterKnife;delete K47*c2=newCharac deleteWeaponStrategy*strategy=NULL;Character*c=newChar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司春节职工活动方案
- 公司电影活动方案
- 公司每年活动方案
- 公司生态酒会活动方案
- 公司活动视频策划方案
- 公司爱心捐助活动方案
- 公司新闻策划方案
- 公司播音室活动方案
- 公司新入职活动策划方案
- 公司旅游节目策划方案
- 大学生体质健康标准与锻炼方法(吉林联盟)智慧树知到期末考试答案章节答案2024年东北师范大学
- 新疆警察学院面试问题及答案
- 小学三到六年级全册单词默写(素材)-2023-2024学年译林版(三起)小学英语
- 水利安全生产风险防控“六项机制”右江模式经验分享
- 幼儿科学探究能力培养策略研究
- 尺桡骨骨折临床路径表单
- 手术室标本丢失的应急预案
- SYT 6587-2021 电子式井斜仪校准方法-PDF解密
- 2024年浙江绍兴市高速公路运营管理有限公司招聘笔试参考题库含答案解析
- 急性脑血管病的护理查房
- 外墙吊篮安全专项施工方案
评论
0/150
提交评论