第13章 外观模式_第1页
第13章 外观模式_第2页
第13章 外观模式_第3页
第13章 外观模式_第4页
第13章 外观模式_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第13章外观/门面模式(Facade)生活中的例子组装电脑,通常会有两种方案。一个方案是去电子市场把自己需要的配件都买回来,然后自己组装另一个方案,就是到电子市场,找一家专业装机的公司,把具体的要求一讲,然后就等着拿电脑就好了外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式什么是外观模式界面:指从一个组件外部来看这个组件,能够看到什么,这就是这个组件的界面,也就是所说的外观。GUI?比如:从一个类外部来看这个类,那么这个类的public方法就是这个类的外观接口:指外部和内部交互的一个通道,通常是指一些方法。可以是类的方法,也可以是interface的方法两个概念引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。外观模式动机外观模式UML类图外观模式外观模式包含如下角色:Facade:外观角色SubSystem:子系统角色publicclassFacade{privateSubSystemAobj1=newSubSystemA();privateSubSystemBobj2=newSubSystemB();privateSubSystemCobj3=newSubSystemC();publicvoidmethod(){obj1.method();obj2.method();obj3.method();}}

典型代码举例一个保安系统由两个录像机,三个电灯、一个遥感器和一个警报器组成。操作人员要经常启动和关闭这些仪器。

不使用外观模式的设计操作这个保安系统的操作员必须直接操作所有的这些部件。public

class

Camera{

public

void

TurnOn()

{

System.out.println("Turning

on

the

camera.");

}

public

void

TurnOff()

{

System.out.println("Turning

off

the

camera.");

}

public

void

Rotate(int

degrees)

{

System.out.println("Rotating

the

camera

by

{0}

degrees.",

degrees);

}

}public

class

Light{

public

void

TurnOff()

{

System.out.println("Turning

on

the

light.");

}

public

void

TurnOn()

{

System.out.println("Turning

off

the

light.");

}

public

void

ChangeBulb()

{

System.out.println("changing

the

light-bulb.");

}

}public

class

Sensor{

public

void

Activate()

{

System.out.println("Activating

the

sensor.");

}

public

void

Deactivate()

{

System.out.println("Deactivating

the

sensor.");

}

public

void

Trigger()

{

System.out.println("The

sensor

has

triggered.");

}

}public

class

Alarm{

public

void

Activate()

{

System.out.println("Activating

the

alarm.");

}

public

void

Deactivate()

{

System.out.println("Deactivating

the

alarm.");

}

public

void

Ring()

{

System.out.println("Ringing

the

alarm.");

}

public

void

StopRing()

{

System.out.println("Stop

the

alarm.");

}

}public

class

Client

{

private

static

Camera

camera1,

camera2;

private

static

Light

light1,

light2,

light3;

private

static

Sensor

sensor;

private

static

Alarm

alarm;

static{

camera1

=

new

Camera();

camera2

=

new

Camera();

light1

=

new

Light();

light2

=

new

Light();

light3

=

new

Light();

sensor

=

new

Sensor();

alarm

=

new

Alarm();

}

public

static

void

main(

String[]

args

)

{

camera1.TurnOn();

camera2.TurnOn();

light1.TurnOn();

light2.TurnOn();

light3.TurnOn();

sensor.Activate();

alarm.Activate();

}

}使用外观模式的设计public

class

SecurityFacade{

private

static

Camera

camera1,

camera2;

private

static

Light

light1,

light2,

light3;

private

static

Sensor

sensor;

private

static

Alarm

alarm;

publicSecurityFacade()

{

camera1

=

new

Camera();

camera2

=

new

Camera();

light1=

new

Light();

light2=

new

Light();

light3

=new

Light();

sensor

=

new

Sensor();

alarm

=

new

Alarm();

}

public

void

Activate()

{

camera1.TurnOn();

camera2.TurnOn();

light1.TurnOn();

light2.TurnOn();

light3.TurnOn();

sensor.Activate();

alarm.Activate();

}

public

void

Deactivate()

{

camera1.TurnOff();

camera2.TurnOff();

light1.TurnOff();

light2.TurnOff();

light3.TurnOff();

sensor.Deactivate();

alarm.Deactivate();

}

}public

class

Client

{

private

static

SecurityFacade

security;

public

static

void

main(

String[]

args

)

{

security

=

new

SecurityFacade();

security.Activate();

Console.WriteLine("\n\n");

security.Deactivate();

}

}举例假设有一个抵押系统,存在三个子系统:

银行子系统(查询是否有足够多的存款)、信用子系统(查询是否有良好的信用)以及贷款子系统(查询有无贷款劣迹),只有这三个子系统都通过时才可进行抵押当客户申请抵押贷款时,他需要分别去这三个子系统办理相关手续,此时若使用外观模式为三个子系统中的接口提供一个统一的服务,这时,客户再办理手续就只需要去一个地方了应用举例外观模式在Java中的应用JDBC屏蔽了与数据库进行连接、查询、更新、删除等一系列操作,因此它就属于外观模式的应用。Hibernate可以算是一种外观模式。javax.faces.webapp.FacesServlet

J2EE核心模式SessionFacade(Session外观)Session外观模式,它建议在多层分布式的应用中,在逻辑业务处理层增加一种起着外观(facade)作用会话Bean,表示层组件通过该会话Bean与其它业务逻辑处理组件(SessionBean,EntityBean,DAO等)交互。J2EE核心模式SessionFacade(Session外观)SessionFacade模式结构图J2EE核心模式SessionFacade(Session外观)Client:可以是一般的JavaObject,或者是BusinessDelegate或其它的SessionBean等SessionFaçade:是一个SessionBean,它负责管理多个BusinessObject,为客户端提供更高级别的访问界面。Client通过SessionFacade完成业务逻辑处理。BusinessObject:业务逻辑处理组件SampleCodeDataAccessLayervs.BusinessLayerDataaccesssubclassesdefineshowtoaccessdatabasesandmetadata.Businesslogicclassesknowshowtousedata.Façade–DataobjectCommonauthenticationinterfaceXMLstandardizeddatastructureSimpleinterfacetoaccessdataDatabaseSQLServerDataAccessSubclassesFacadeDataObject<Classes>BusinessLogic<Classes>DatabaseAccessClientWebPage<Classes>SampleCode...privatevoidGetData(intproductID){VirtualObjectModel.Framework.Loginlogin=newVirtualObjectModel.Framework.Login(

System.Configuration.ConfigurationSettings.AppSettings["LoginID"],

System.Configuration.ConfigurationSettings.AppSettings["Password"],

System.Configuration.ConfigurationSettings.AppSettings["Database"],

System.Configuration.ConfigurationSettings.AppSettings["DatabaseServer"]);VOM.ObjectModel.Northwind.Productsobj=new

VOM.ObjectModel.Northwind.Products(login.ConnectionString);

obj.GetData(productID);

SetData(obj);}...Client–ASP.NETpageSampleCode[Serializable()]publicclassProducts{...publicvirtualvoidGetData(intproductID){try{XLMLDataTablexdt=newXLMLDataTable(_connectionString);xdt.DataSourceType=XLMLType.DataSourceType.SQLServer;xdt.CommandText=@"SELECT*FROMNorthwind.dbo.[Products]WHEREProductID=@ProductID";xdt.XLMLParameterList.Add("@ProductID",VirtualObjectModel.Framework.XLMLType.DataType.INT).Value=productID;xdt.GetData();foreach(XLMLDataRowxdrinxdt.XLMLDataRowList){Productsobj=this;xdr.SetAttribute(obj);};}catch(System.Exceptionex){throwex;}}...}BusinessObjectSampleCodepublicclassXLMLDataTable:XLML{publicvoidGetData(){try{if(this.ConnectionString!=string.Empty||this.CommandText!=string.Empty){XLMLDataTablexlmlDataTable=newXLMLDataTable();switch(this.DataSourceType){caseXLMLType.DataSourceType.SQLServer:xlmlDataTable=GetXLMLDataTable(MSSQLServerDataService.ExecuteReader(this.ConnectionString,this.CommandType,...break;caseXLMLType.DataSourceType.Access:xlmlDataTable=GetXLMLDataTable(GetDataTable(this.ConnectionString,this.CommandText));break;default:break;}this.Description=xlmlDataTable.Description;this.ID=xlmlDataTable.ID;this.XLMLDataColumnList=xlmlDataTable.XLMLDataColumnList;this.XLMLDataRowList=xlmlDataTable.XLMLDataRowList;}}catch(Exceptionex){this.Exception=ex;}}}Façade–DataObjectSampleCodepublicclassXLML{...protectedXLMLDataTableGetXLMLDataTable(SqlDataReadersqlDataReader){XLMLDataTablexlmlDataTable=newXLMLDataTable();try{SetDataTableSchema(sqlDataReader,refxlmlDataTable);SetDataRowList(sqlDataReader,refxlmlDataTable);}catch(Exceptionex){throwex;}finally{sqlDataReader.Close();}returnxlmlDataTable;}...}DataAccessSubclassCreateanObject-OrientedJavaScriptCalendarUsingtheFaçadeDesignPattern/getHelpOn/10MinuteSolution/19988#codeitemareaWhiledoingsomeshoppingoneday,Inoticedthatnearlyeveryretailoutletofferssomekindofcalendar,eachattractivelydecoratedwithanimagetheme.ItoccurredtomethatitwouldbeinterestingtocreateaWeb-basedcalendarwhereIcouldcontroltheimagesdisplayedforeachmonth.Inaddition,bydisplayingthecalendarwithouttheimagesyoucanmakeitservedoubledutyasadatepickercomponent.CreateanObject-OrientedJavaScriptCalendarUsingtheFaçadeDesignPattern对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。外观模式优点降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。外观模式优点不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。在不引入抽象外观类的情况下,增加新的子系统可能需要修改外

温馨提示

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

评论

0/150

提交评论