15设计模式外观模式(Facade).ppt_第1页
15设计模式外观模式(Facade).ppt_第2页
15设计模式外观模式(Facade).ppt_第3页
15设计模式外观模式(Facade).ppt_第4页
15设计模式外观模式(Facade).ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1、设计模式(Design Pattern),张凯 副教授 计算机学院 软件工程系,问题(Problem),给银行做个贷款系统 当客户来进行抵押贷款时,有如下几件事情需要确认: 1、到银行子系统查询他是否有足够多的存款 2、到信用子系统查询他是否有良好的信用 3、到贷款子系统查询他有无贷款劣迹 只有这三个子系统都通过时才可进行抵押。,问题(Problem),问题(Problem),/顾客类 public class Customer private string _name; public Customer(string name) this._name = name; public string

2、 Name get return _name; ,问题(Problem),public class Bank /银行子系统 public bool HasSufficientSavings(Customer c, int amount) Console.WriteLine(查询银行信息,客户名 + c.Name); return true; public class Credit /信用子系统 public bool HasGoodCredit(Customer c) Console.WriteLine(查询信用信息,客户名 + c.Name); return true; public cla

3、ss Loan /贷款子系统 public bool HasNoBadLoans(Customer c) Console.WriteLine(查询贷款信息,客户名 + c.Name); return true; ,问题(Problem),static void Main(string args) Bank bank = new Bank(); Loan loan = new Loan(); Credit credit = new Credit(); int Money = 12000; Customer customer = new Customer(张三); bool eligible =

4、true; if (!bank.HasSufficientSavings(customer, Money) eligible = false; else if (!loan.HasNoBadLoans(customer) eligible = false; else if (!credit.HasGoodCredit(customer) eligible = false; Console.WriteLine(客户 + customer.Name + 已经被 + (eligible ? 通过 : 拒绝); Console.ReadLine(); ,可以看到,客户程序与三个子系统都发生了耦合,这种

5、耦合使得客户程序依赖于子系统,当子系统化时,客户程序也将面临很多变化的挑战。,主要内容,外观模式(Facade),模式动机 模式名称:外观模式(Facade) 将一个系统划分为若干个子系统有利于降低系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统中较一般的设置提供了一个单一而简单的界面。,外观模式(Facade),模式动机 外观模式要求一个子系统的外部与其内部的通信必须通过一个统一的外观(Facade)对象进行。就如同医院的接待员一样,外观模式的外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打

6、交道,而不需要与子系统内部的很多对象打交道。,外观模式(Facade),模式动机 在没有外观类(Facade)之前,客户类(Client)需要和子系统类(Subsystem)进行复杂的交互,系统的耦合度很大;而增加一个外观类之后,客户类只需要直接和外观类交互,子系统类之间的复杂关系由外观类来实现,从而降低了系统的耦合度。,外观模式(Facade),模式定义 外观模式(Facade):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式是对象的结构模式。,外观模式(Facade),一

7、个合理的设计就是为这些子系统创建一个统一的接口,这个接口将简化客户程序的判断操作。 引入Facade模式后的类结构图,外观模式(Facade),public class Mortgage /外观类 private Bank bank = new Bank(); private Loan loan = new Loan(); private Credit credit = new Credit(); public bool IsEligible(Customer cust, int amount) Console.WriteLine(0 申请 1:C 贷款 , cust.Name, amount

8、); bool eligible = true; if (!bank.HasSufficientSavings(cust, amount) eligible = false; else if (!loan.HasNoBadLoans(cust) eligible = false; else if (!credit.HasGoodCredit(cust) eligible = false; return eligible; ,外观模式(Facade),static void Main(string args) Mortgage mortgage = new Mortgage(); /外观 Cus

9、tomer customer = new Customer(张三); bool eligable = mortgage.IsEligible(customer, 125000); Console.WriteLine(客户 +customer.Name+ 已经被 +(eligable ? 通过 : 拒绝); Console.ReadLine(); ,引入Faade模式后,客户程序只与Mortgage发生依赖,也就是Mortgage屏蔽了子系统之间的复杂的操作,达到了解耦内部子系统与客户程序之间的依赖。,外观模式(Facade),static void Main(string args) Bank

10、 bank = new Bank(); Loan loan = new Loan(); Credit credit = new Credit(); int Money = 12000; Customer customer = new Customer(张三); bool eligible = true; if (!bank.HasSufficientSavings(customer, Money) eligible = false; else if (!loan.HasNoBadLoans(customer) eligible = false; else if (!credit.HasGood

11、Credit(customer) eligible = false; Console.WriteLine(客户 + customer.Name + 已经被 + (eligible ? 通过 : 拒绝); Console.ReadLine(); ,外观模式(Facade),模式结构,外观模式(Facade),参与者 Facade:外观角色 SubSystem:子系统角色,外观模式(Facade),保安系统例子 一个保安系统由两个录像机、三个电灯、一个遥感器和一个警报器组成。保安系统的操作人员需要经常将这些仪器启动和关闭。,外观模式(Facade),保安系统例子,外观模式(Facade),保安系统

12、例子 Client对象需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象。,publicclassCamera publicvoidTurnOn() Console.WriteLine(Turningonthecamera.); publicvoidTurnOff() Console.WriteLine(Turningoffthecamera.); publicvoidRotate(intdegrees) Console.WriteLine(Rotatingthecameraby0degrees.,degrees); ,外观模式(Fac

13、ade),保安系统例子 Client对象需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象。,publicclassLight publicvoidTurnOff() Console.WriteLine(Turningonthelight.); publicvoidTurnOn() Console.WriteLine(Turningoffthelight.); publicvoidChangeBulb() Console.WriteLine(changingthelight-bulb.); ,外观模式(Facade),保安系统例子 Cl

14、ient对象需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象。,publicclassSensor publicvoidActivate() Console.WriteLine(Activatingthesensor.); publicvoidDeactivate() Console.WriteLine(Deactivatingthesensor.); publicvoidTrigger() Console.WriteLine(Thesensorhastriggered.); ,外观模式(Facade),保安系统例子 Client对象

15、需要引用到所有的录像机(Camera)、电灯(Light)、感应器(Sensor)和警报器(Alarm)对象。,publicclassAlarm publicvoidActivate() Console.WriteLine(Activatingthealarm.); publicvoidDeactivate() Console.WriteLine(Deactivatingthealarm.); publicvoidRing() Console.WriteLine(Ringingthealarm.); publicvoidStopRing() Console.WriteLine(Stopthea

16、larm.); ,外观模式(Facade),保安系统例子,publicstaticvoidMain(stringargs) privatestaticCameracamera1,camera2; privatestaticLightlight1,light2,light3; privatestaticSensorsensor; privatestaticAlarmalarm; camera1=newCamera(); camera2=newCamera(); light1=newLight(); light2=newLight(); light3=newLight(); sensor=newS

17、ensor(); alarm=newAlarm(); camera1.TurnOn(); camera2.TurnOn(); light1.TurnOn(); light2.TurnOn(); light3.TurnOn(); sensor.Activate(); alarm.Activate(); ,外观模式(Facade),外观模式 一个合情合理的改进方法就是准备一个系统的控制台,作为保安系统的用户界面。,外观模式(Facade),外观模式,外观模式(Facade),外观模式,publicclassSecurityFacade privatestaticCameracamera1,came

18、ra2; 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)

温馨提示

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

评论

0/150

提交评论