`
- 浏览:
494687 次
- 性别:
- 来自:
北京
-
http://tianli.blog.51cto.com/190322/36741
摘要:本文深入浅出的讲述了设计模式中的外观模式,并给出了简单的示例,例子浅显易懂,并附带源代码。
外观模式属于结构型模式,其意图是为子系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。在项目设计中,把一个系统划分成为若干个子系统由利于降低系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,达到该目标的途径之一就是引入一个外观对象,它为子系统中较一般的设施提供了一个单一而简单的界面。
实用性:
l 当需要为一个复杂子系统提供一个简单的接口时。子系统往往因为不断演化而变得越来越复杂,大多是模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行订制,但是这也给那些不需要订制子系统的用户带来一些使用上的困难。
l 客户程序与抽象类的实现部分之间存在很大的依赖性,引入façade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
l 当你需要构建一个层次结构的子系统时,使用Façade模式定义子系统中每层的入口点,如果子系统间是相互依赖的,你可以让他们通过Facade进行通讯,从而简化他们之间的依赖关系。
例如在一个泡茶的过程中,需要作如下的工作:烧开水,准备茶叶,把茶叶放在被子里,把烧开的水放到茶杯中,只有经过这些过程之后才能泡出好的茶叶来。这是一个常用的步骤,80%的泡茶步骤都是这个样子的,可以把这些动作串联起来,形成一个整体的步骤,就是MakeACuppa(),这样在调用步方法时也比较方便。这便是外观模式,里面的细节被屏蔽掉了。当然如果想更详细的控制每个步骤地过程,也允许进行相应的控制,但是必须自己创建类。
图1
参与者:
Façade(DacadeCuppaMaker):知道那些子系统类负责处理请求;将客户的请求代理给适当的子系统。
SubSystem classes(water,Teabag):实现自系统的功能,处理由Façade 对象指派的任务,没有Facade的任何相关信息,即没有指向Façade的指针。
他们之间的协作关系是:客户程序通过发送请求给Façade的方式与子系统通讯,Facade将这些消息转发给适当的子系统对象,尽管是子系统的有关对象在做实际工作,但Façade模式本身也必须将它的接口转换成子系统的接口。使用façade的客户程序不需要直接访问子系统对象。
使用Façade模式有下面一些优点:
1. 他对客户屏蔽子系统组件,因而减少了客户处理的对象的树木并使得子系统使用起来更加方便。
2. 实现了自系统与客户之间的松散耦合关系,而自系统内部的功能组件往往是紧耦合的。松耦合关系使得自系统的组件变化不会影响到他的客户。
3. 如果需要他们不限制他们使用子系统类。
在本系统中,Teacup使用water和TeaBag泡一杯茶水,泡茶的过程比较复杂,这相当于一个子系统,在这个子系统中泡茶的每一个步骤都是紧密相连的,如果使用每个子类按照泡茶的步骤一步步地走下来也可以达到目的,但是在这个过程中需要创建子类,调用子类的方法,或者检测子类的变量,而在客户端大部分的操作都是使用一样的代码,把这些一样的代码抽取出来形成一个能完成一特定功能的类,便形成了Façade模式的代码。使用了Façade模式就使得这些操作聚合在一起,方便客户端调用。
相应的代码:
Water代码:
package facade;
public class Water{
boolean waterIsBoiling;
public Water(){
setWaterIsBoiling(false);
System.out.println("纯净的水准备好了");
}
public void setWaterIsBoiling(boolean isWaterBoiling){
waterIsBoiling = isWaterBoiling;
}
public boolean getWaterIsBoiling(){
return waterIsBoiling;
}
public void boilFacadeWater(){
setWaterIsBoiling(true);
System.out.println("水在沸腾");
}
}
TeaBag代码:
package facade;
public class TeaBag{
public TeaBag(){
System.out.println("清香的茶包准备好了!");
}
}
TeaCup代码:
package facade;
public class TeaCup{
private boolean teaBagIsSteeped;
private Water facadeWater;
private TeaBag facadeTeaBag;
public TeaCup(){
setTeaBagIsSteeped(true);
System.out.println("茶杯准备好了");
}
public void setTeaBagIsSteeped(boolean isTeaBagSteeped){
teaBagIsSteeped = true;
}
public boolean getTeaBagIsSteeped(){
return teaBagIsSteeped;
}
public void addFacadeTeaBag(TeaBag facadeTeaBagIn){
facadeTeaBag = facadeTeaBagIn;
System.out.println("茶包放在茶杯了");
}
public void addFacadeWater(Water facadeWaterIn){
facadeWater = facadeWaterIn;
}
public void steepTeaBag(){
if(facadeTeaBag != null &&facadeWater != null && facadeWater.getWaterIsBoiling()){
System.out.println("茶叶渗透到杯子中了");
setTeaBagIsSteeped(true);
}
else{
System.out.println("茶叶没有渗透到杯子中");
setTeaBagIsSteeped(false);
}
}
public String toString(){
if(getTeaBagIsSteeped()){
return "一杯又香又浓的茶冲好了";
}
else
return "一杯又香又浓的茶冲好了";
}
}
FacadeCuppaMaker代码;
package facade;
public class FacadeCuppaMaker{
private boolean TeaBagIsSteeped;
public FacadeCuppaMaker(){
System.out.println("FacadeCuppaMaker 准备好冲茶了");
}
public TeaCup makeACuppa(){
TeaCup cup = new TeaCup();
TeaBag teaBag= new TeaBag();
Water water = new Water();
cup.addFacadeTeaBag(teaBag);
water.boilFacadeWater();
cup.addFacadeWater(water);
cup.steepTeaBag();
return cup;
}
}
Client代码:
package facade;
public class Client{
public static void main(String[] args){
FacadeCuppaMaker cuppaMaker = new FacadeCuppaMaker();
TeaCup teaCup = cuppaMaker.makeACuppa();
System.out.println(teaCup);
}
}
总结:外观模式的主要用途就是为子系统的复杂处理过程提供方便的调用方法,使得子系统更加容易被使用。Façade对象通常属于Singleton模式。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
外观模式(Facade Pattern)是设计模式中的一种结构型模式,其主要目的是为了简化客户端与复杂系统之间的交互。在C#编程中,外观模式通常用于减少客户端对子系统组件的依赖,提供一个统一的、高层次的接口,使得...
外观模式(Facade Pattern),又称门面模式,属于对象结构型模式的一种。其主要作用是为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易被使用。在实际应用中,当一个系统变得越来越复杂,对外暴露的...
9. **外观模式**(Facade) - **描述**:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 - **示例**:复杂的多媒体播放器API简化为简单的播放、...
2. **结构型模式**(Structural Patterns):这类模式主要关注如何组合类和对象以形成更大的结构,包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、组合模式...
java ...包名facade_pattern表示的是外观模式的简单例子 包名template_method_pattern表示的是外观模式的简单例子 包名state_pattern表示的是状态模式的简单例子 包名state_pattern.normal表示的是无状
2. **结构型模式**:这些模式关注如何组合现有的组件以形成更大的结构,例如适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、组合模式...
### Java设计模式学习笔记——外观模式(Facade Pattern) #### 概述 设计模式是软件工程领域中一种解决常见问题的可复用解决方案。在Java开发过程中,掌握设计模式能够帮助开发者更好地组织代码结构,提高代码的...
外观模式(Facade) 外观模式是一种结构型设计模式,它为子系统中的一组接口提供一个一致的界面,该模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。文章中提到的“Nikon相机”,通过外观模式为复杂...
在幽默的例子中,为女朋友拍摄专业照片可能需要使用多种摄影技巧,而外观模式可以提供一个简单的接口,让女朋友只需关注拍照结果,而不用关心具体的技术细节。在软件设计中,外观模式可以简化复杂的子系统,提供一个...
在Alex Martelli提供的部分例子中,他提到了Python标准库中的几个外观模式的应用实例: - `dbhash`:这是一个针对`bsddb`模块的外观,提供了高度简化且符合`dbm`接口的子集访问方式。这里不仅体现了外观模式简化...
外观模式 (FACADE)** - **应用场景**:当一个子系统的多个类需要对外提供一个一致的接口时,可以使用外观模式。 - **模式描述**:外观模式提供了一个高层接口,这个接口使得这一子系统更加容易使用。该模式的主要...
**外观模式(Facade Pattern)**是软件设计模式中的一种结构型模式,它的主要目的是为了简化客户端与复杂的子系统之间的交互,降低两者之间的耦合度。在JavaScript中,外观模式同样有着广泛的应用,尤其是在构建模块...
外观模式(Facade) 外观模式是一种结构型设计模式,用于提供一个统一的接口,以控制对子系统中一组接口的访问。这简化了系统的使用,对外部来说,只需要通过一个统一的外观接口即可访问整个子系统。如文中的...
- **外观模式(Facade Pattern)**:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 - **装饰模式(Decorator Pattern)**:动态地给一个对象添加一些...
- 外观模式(Facade):为子系统提供一个统一的接口,使子系统更加易用。 - 桥接模式(Bridge):将抽象部分与它的实现部分分离,使它们可以独立地变化。 - 适配器模式(Adapter):将一个类的接口转换成客户希望...
- **外观模式**(Facade):为子系统提供一个一致的界面,简化了客户端与其交互。 - **享元模式**(Flyweight):运用共享技术有效地支持大量细粒度的对象。 3. **行为型模式**: - **策略模式**(Strategy):...
11. 外观模式(Facade Pattern):外观模式提供了一个统一的接口,用来访问子系统中的一组接口,使得客户端无需了解子系统内部的复杂性。 12. 适配器模式(Adapter Pattern):适配器模式将两个不兼容的接口通过...
外观模式(Facade) 外观模式是一种结构型设计模式,它为子系统中的一组接口提供一个一致的界面。在“追MM”的情境下,外观模式可以帮助简化追求过程中的复杂度,比如通过一个统一的追求计划来协调所有行动,使其...