




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 承包地转包合同协议书
- 烧烤店合同解除协议书
- 考科目二协议书
- 退出入股协议书
- 费用资助协议书
- 药品上市协议书
- 土地置换及建设协议书
- 茶叶代卖协议书
- 纸厂销毁协议书
- 未施工合同解除协议书
- 学校食堂“三同三公开”制度实施方案
- 危化品驾驶员押运员安全培训
- 2025年福建福州地铁集团有限公司招聘笔试参考题库含答案解析
- 肝硬化行TIPS术后整体护理查房
- 人工智能在新闻媒体领域的应用
- 【MOOC】儒家伦理-南京大学 中国大学慕课MOOC答案
- 银保部三年规划
- 2024治安调解协议书样式
- 零工市场(驿站)运营管理 投标方案(技术方案)
- 小学二年级数学找规律练习题及答案
- 智研咨询重磅发布:2024年中国航运行业供需态势、市场现状及发展前景预测报告
评论
0/150
提交评论