设计模式.外观模式(Facade).pptx
LOGO设计模式设计模式(Design Pattern)张凯 副教授计算机学院 软件工程系武汉科技大学问题问题(Problem)(Problem)v给银行做个贷款系统当客户来进行抵押贷款时,有如下几件事情需要确认:1、到银行子系统查询他是否有足够多的存款2、到信用子系统查询他是否有良好的信用3、到贷款子系统查询他有无贷款劣迹只有这三个子系统都通过时才可进行抵押。武汉科技大学问题问题(Problem)(Problem)武汉科技大学问题问题(Problem)(Problem)/顾客类publicclassCustomerprivatestring_name;publicCustomer(stringname)this._name=name;publicstringNamegetreturn_name;武汉科技大学问题问题(Problem)(Problem)publicclassBank/银行子系统publicboolHasSufficientSavings(Customerc,intamount)Console.WriteLine(查询银行信息,客户名+c.Name);returntrue;publicclassCredit/信用子系统publicboolHasGoodCredit(Customerc)Console.WriteLine(查询信用信息,客户名+c.Name);returntrue;publicclassLoan/贷款子系统publicboolHasNoBadLoans(Customerc)Console.WriteLine(查询贷款信息,客户名+c.Name);returntrue;武汉科技大学问题问题(Problem)(Problem)staticvoidMain(stringargs)Bankbank=newBank();Loanloan=newLoan();Creditcredit=newCredit();int Money=12000;Customercustomer=newCustomer(张三);booleligible=true;if(!bank.HasSufficientSavings(customer,Money)eligible=false;elseif(!loan.HasNoBadLoans(customer)eligible=false;elseif(!credit.HasGoodCredit(customer)eligible=false;Console.WriteLine(客户+customer.Name+已经被+(eligible?通过:拒绝);Console.ReadLine();可以看到,客户程序与三个子系统都发生了耦合,这种耦合使得客户程序依赖于子系统,当子系统化时,客户程序也将面临很多变化的挑战。武汉科技大学主要内容主要内容模式动机与定义1模式结构与分析2模式实例与解析3模式效果与应用4武汉科技大学外观模式外观模式(Facade)(Facade)v模式动机模式名称:外观模式(Facade)将一个系统划分为若干个子系统有利于降低系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统中较一般的设置提供了一个单一而简单的界面。武汉科技大学外观模式外观模式(Facade)(Facade)v模式动机外观模式要求一个子系统的外部与其内部的通信必须通过一个统一的外观(Facade)对象进行。就如同医院的接待员一样,外观模式的外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。武汉科技大学外观模式外观模式(Facade)(Facade)v模式动机在没有外观类(Facade)之前,客户类(Client)需要和子系统类(Subsystem)进行复杂的交互,系统的耦合度很大;而增加一个外观类之后,客户类只需要直接和外观类交互,子系统类之间的复杂关系由外观类来实现,从而降低了系统的耦合度。武汉科技大学外观模式外观模式(Facade)(Facade)v模式定义外观模式(Facade):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是对象的结构模式。武汉科技大学外观模式外观模式(Facade)(Facade)一个合理的设计就是为这些子系统创建一个统一的接口,这个接口将简化客户程序的判断操作。引入Facade模式后的类结构图武汉科技大学外观模式外观模式(Facade)(Facade)publicclassMortgage/外观类privateBankbank=newBank();privateLoanloan=newLoan();privateCreditcredit=newCredit();publicboolIsEligible(Customercust,intamount)Console.WriteLine(0申请1:C贷款,cust.Name,amount);booleligible=true;if(!bank.HasSufficientSavings(cust,amount)eligible=false;elseif(!loan.HasNoBadLoans(cust)eligible=false;elseif(!credit.HasGoodCredit(cust)eligible=false;returneligible;武汉科技大学外观模式外观模式(Facade)(Facade)staticvoidMain(stringargs)Mortgagemortgage=newMortgage();/外观Customercustomer=newCustomer(张三);booleligable=mortgage.IsEligible(customer,125000);Console.WriteLine(客户+customer.Name+已经被+(eligable?通过:拒绝);Console.ReadLine();引入Faade模式后,客户程序只与Mortgage发生依赖,也就是Mortgage屏蔽了子系统之间的复杂的操作,达到了解耦内部子系统与客户程序之间的依赖。武汉科技大学外观模式外观模式(Facade)(Facade)staticvoidMain(stringargs)Bankbank=newBank();Loanloan=newLoan();Creditcredit=newCredit();int Money=12000;Customercustomer=newCustomer(张三);booleligible=true;if(!bank.HasSufficientSavings(customer,Money)eligible=false;elseif(!loan.HasNoBadLoans(customer)eligible=false;elseif(!credit.HasGoodCredit(customer)eligible=false;Console.WriteLine(客户+customer.Name+已经被+(eligible?通过:拒绝);Console.ReadLine();武汉科技大学外观模式外观模式(Facade)(Facade)v模式结构武汉科技大学外观模式外观模式(Facade)(Facade)v参与者Facade:外观角色 SubSystem:子系统角色武汉科技大学外观模式外观模式(Facade)(Facade)v保安系统例子一个保安系统由两个录像机、三个电灯、一个遥感器和一个警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。武汉科技大学外观模式外观模式(Facade)(Facade)v保安系统例子武汉科技大学外观模式外观模式(Facade)(Facade)v保安系统例子Client对象需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象。publicclassCamerapublicvoidTurnOn()Console.WriteLine(Turningonthecamera.);publicvoidTurnOff()Console.WriteLine(Turningoffthecamera.);publicvoidRotate(intdegrees)Console.WriteLine(Rotatingthecameraby0degrees.,degrees);武汉科技大学外观模式外观模式(Facade)(Facade)v保安系统例子Client对象需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象。publicclassLightpublicvoidTurnOff()Console.WriteLine(Turningonthelight.);publicvoidTurnOn()Console.WriteLine(Turningoffthelight.);publicvoidChangeBulb()Console.WriteLine(changingthelight-bulb.);武汉科技大学外观模式外观模式(Facade)(Facade)v保安系统例子Client对象需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象。publicclassSensorpublicvoidActivate()Console.WriteLine(Activatingthesensor.);publicvoidDeactivate()Console.WriteLine(Deactivatingthesensor.);publicvoidTrigger()Console.WriteLine(Thesensorhastriggered.);武汉科技大学外观模式外观模式(Facade)(Facade)v保安系统例子Client对象需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象。publicclassAlarmpublicvoidActivate()Console.WriteLine(Activatingthealarm.);publicvoidDeactivate()Console.WriteLine(Deactivatingthealarm.);publicvoidRing()Console.WriteLine(Ringingthealarm.);publicvoidStopRing()Console.WriteLine(Stopthealarm.);武汉科技大学外观模式外观模式(Facade)(Facade)v保安系统例子publicstaticvoidMain(stringargs)privatestaticCameracamera1,camera2;privatestaticLightlight1,light2,light3;privatestaticSensorsensor;privatestaticAlarmalarm;camera1=newCamera();camera2=newCamera();light1=newLight();light2=newLight();light3=newLight();sensor=newSensor();alarm=newAlarm();camera1.TurnOn();camera2.TurnOn();light1.TurnOn();light2.TurnOn();light3.TurnOn();sensor.Activate();alarm.Activate();武汉科技大学外观模式外观模式(Facade)(Facade)v外观模式一个合情合理的改进方法就是准备一个系统的控制台,作为保安系统的用户界面。武汉科技大学外观模式外观模式(Facade)(Facade)v外观模式武汉科技大学外观模式外观模式(Facade)(Facade)v外观模式publicclassSecurityFacadeprivatestaticCameracamera1,camera2;privatestaticLightlight1,light2,light3;privatestaticSensorsensor;privatestaticAlarmalarm;staticSecurityFacade()camera1=newCamera();camera2=newCamera();light1=newLight();light2=newLight();light3=newLight();sensor=newSensor();alarm=newAlarm();publicvoidActivate()camera1.TurnOn();camera2.TurnOn();light1.TurnOn();light2.TurnOn();light3.TurnOn();sensor.Activate();alarm.Activate();publicvoidDeactivate()camera1.TurnOff();camera2.TurnOff();light1.TurnOff();light2.TurnOff();light3.TurnOff();sensor.Deactivate();alarm.Deactivate();武汉科技大学外观模式外观模式(Facade)(Facade)v外观模式publicstaticvoidMain(stringargs)privatestaticSecurityFacadesecurity;security=newSecurityFacade();security.Activate();Console.WriteLine(n-n);security.Deactivate();武汉科技大学外观模式外观模式(Facade)(Facade)v外观模式的优缺点如下外观模式的优点主要有以下几点:它对客户屏蔽子系统组件,减少了客户处理的对象数目使得子系统使用起来更加容易。它实现了子系统与客户之间的松耦合关系。这使得子系统的组件变化不会影响到它的客户。提高了安全性,通过外观模式,屏蔽子系统业务逻辑。武汉科技大学外观模式外观模式(Facade)(Facade)v外观模式的优缺点如下它简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其它的子系统。它并不限制复杂应用使用子系统类。外观模式并不增加任何功能性模式,它仅仅是一些简单化接口。武汉科技大学外观模式外观模式(Facade)(Facade)v模式使用在以下情况可以使用外观模式:当要为一个复杂子系统提供一个简单接口时。这个接口对大多数用户来说已经足够好;那些需要更多可定制性的用户可以越过Facade层。子系统相对独立外界只需黑箱操作即可。例如利息计算。预防操作人员带来的风险扩散。武汉科技大学外观模式外观模式(Facade)(Facade)v模式应用子系统可以有多个外观。外观不参与子系统的业务逻辑。LOGO