您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 资本运营 > 设计模式_4_结构型模式(一)
-0-第4章结构型模式(一)本章目标了解什么是门面模式掌握门面模式的应用了解什么是组合模式掌握组合模式的应用本章单词:facade________________________composite_____________________camera________________________sensor________________________alarm_________________________leaf__________________________composite_____________________-1-4.1门面模式(Facade)4.1.1概念把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。首先病人必须先挂号,然后门诊。如果医生要求化验,病人必须首先划价,然后缴款,才能到化验部门做化验。化验后,再回到门诊室。解决这种不便的方法便是引进门面模式。可以设置一个接待员的位置,由接待员负责代为挂号、划价、缴费、取药等。这个接待员就是门面模式的体现,病人只接触接待员,由接待员负责与医院的各个部门打交道。1、名称门面模式(facade)又称外观模式。为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。定义中提到的子系统是指在设计中为了降低复杂性根据一定的规则(比如业务、功能),对系统进行的划分。子系统中封装有一些类。客户程序在使用子系统的时候,可能会像下图一样零乱。2、结构门面模式是对象的结构模式。门面模式没有一个一般化的类图描述,图4-1演示了一个门面模式的示意性对象结构。图4-1门面模式对象结构-2-3、意图外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式的意图。4、角色门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。子系统(subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。4.1.2适用范围门面模式的使用环境:当你要为一个复杂子系统提供一个简单接口时。在上面已经描述了原因。客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性(上面也提到了)。当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。4.1.3实现我们考察一个保安系统的例子,以说明门面模式的功效。一个保安系统由两个录像机、三个电灯、一个遥感器和一个警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。【不使用门面模式的设计】首先,在不使用门面模式的情况下,操作这个保安系统的操作员必须直接操作所有的这些部件。图4-2是在不使用门面模式的情况下的系统设计。-3-图4-2无门面模式结构可以看出,Client对象需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象,各部分代码分别如下描述。Camera类:packagecom.sanlian.mode.facade;/***录像机*@authorsanlian*@versionNov27,20109:13:22AM*/publicclassCamera{publicvoidturnOn(){System.out.println(Turningonthecamera.);}publicvoidturnOff(){System.out.println(Turningoffthecamera.);}publicvoidrotate(intdegrees){System.out.println(Rotatingthecameraby+degrees+degrees.);}-4-}Light类:packagecom.sanlian.mode.facade;/***电灯*@authorsanlian*@versionNov27,20109:13:37AM*/publicclassLight{publicvoidturnOff(){System.out.println(Turningonthelight.);}publicvoidturnOn(){System.out.println(Turningoffthelight.);}publicvoidchangeBulb(){System.out.println(changingthelight-bulb.);}}Sensor类:packagecom.sanlian.mode.facade;/***感应器*@authorsanlian*@versionNov27,20109:13:53AM*/publicclassSensor{publicvoidactivate(){System.out.println(Activatingthesensor.);}publicvoiddeactivate(){System.out.println(Deactivatingthesensor.);}publicvoidtrigger(){System.out.println(Thesensorhastriggered.);-5-}}Alarm类:packagecom.sanlian.mode.facade;/***报警器*@authorsanlian*@versionNov27,20109:14:02AM*/publicclassAlarm{publicvoidactivate(){System.out.println(Activatingthealarm.);}publicvoiddeactivate(){System.out.println(Deactivatingthealarm.);}publicvoidring(){System.out.println(Ringingthealarm.);}publicvoidstopRing(){System.out.println(Stopthealarm.);}}客户端Client类:packagecom.sanlian.mode.facade;/***客户*@authorsanlian*@versionNov27,20109:14:13AM*/publicclassClient{privatestaticCameracamera;privatestaticLightlight;privatestaticSensorsensor;privatestaticAlarmalarm;-6-/***静态块*/static{camera=newCamera();light=newLight();sensor=newSensor();alarm=newAlarm();}publicstaticvoidmain(String[]args){camera.turnOn();light.turnOn();sensor.activate();alarm.activate();}}【使用门面模式的设计】一个合情合理的改进方法就是准备一个系统的控制台,作为保安系统的用户界面。如图4-3所示。图4-3使用门面模式的结构程序代码如下(其中Camera、Light、Sensor、Alarm无变化,所以这里未给出实现代码)。SecurityFacade类:packagecom.sanlian.mode.facade;-7-/***门面类*@authorsanlian*@versionNov27,20109:25:07AM*/publicclassSecurityFacade{privatestaticCameracamera;privatestaticLightlight;privatestaticSensorsensor;privatestaticAlarmalarm;/***静态块*/static{camera=newCamera();light=newLight();sensor=newSensor();alarm=newAlarm();}publicvoidactivate(){camera.turnOn();light.turnOn();sensor.activate();alarm.activate();}publicvoiddeactivate(){camera.turnOff();light.turnOff();sensor.deactivate();alarm.deactivate();}}客户端Client类代码如下:packagecom.sanlian.mode.facade;/***客户*@authorsanlian*@versionNov27,20109:14:13AM-8-*/publicclassClient{privatestaticSecurityFacadesecurity;publicstaticvoidmain(String[]args){security=newSecurityFacade();security.activate();System.out.println(\n--------------------\n);security.deactivate();}}4.1.4优缺点它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。Facade模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。Facade模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候尤为重要。在大型软件系统中降低编译依赖性至关重要。在子系统类改变时,希望尽量减少重编译工作以节省时间。用Facade可以降低编译依赖性,限制重要系统中较小的变化所需的重编译工作。Facade模式同样也有利于简化系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。如果应用需要,它并不限制它们使用子系统类。因此你可以让客户程序在系统易用性和通用性之间加以选择。4.2组合模式(Composite)4.2.1概念Composite模式是以树型结构组织对象,用统一的方式处理“部分”与“整体”。如下在恋爱中Composite模式的体现:――MM过生日,GG自然要送上礼物以表心意。MM:“我过生日,你要送我一件礼物。”GG:“嗯,好吧,去商店,你自己挑。”-9-MM:“这件T恤挺漂亮,买,这条裙子好看,买,这个包也不错,买。”GG:“喂,买了三件了呀,我只答应送一件礼物的哦。”MM:“什么呀,T恤加裙子加包包,正好配成一套呀,小姐,麻烦你包起来。”GG:“……”(口吐白沫,四肢抽搐,不省人事ing……)案例分析:该MM十分之聪明地运用了Composite模式,将3件礼物“合成”至1件(套),从而让GG以买一件礼物的方式(反正GG只要付一次钱~~)买了3件礼物。由此不难看出,Composite将对象以树形结构组织起来,以达到“部分-整体”的层次结构,使得客户(钱包瘪瘪的GG)对单个对象和组合对象(1件vs1套)的使用具有一致性(付一次钱)。1、名称合成模式有时又叫做部分-整体模式(Part-Whole)。合成模式将对象组织
本文标题:设计模式_4_结构型模式(一)
链接地址:https://www.777doc.com/doc-2024497 .html