java设计模式之外观模式Facade

1、 意图

为子系统中的一组接口提供一个一致的界面,Façade模式定义了一个高层接口,这一接口使得这一子系统更加容易使用。

2、 适用性

在遇到以下情况时使用:

  • 当你要为一个复杂子系统提供一个简单接口时。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。
  • 当你需要构建一个层次结构的子系统时,使用façade模式定义子系统中每层的入口。

3、 结构


4、 参与者

Façade

           知道哪些子系统类负责子系统对象;

           将客户的请求代理给适当的子系统对象。

 Subsystemclasses

                   实现子系统的功能。

                   处理由Façade对象指派的任务。

                   没有façade的任何相关信息;即没有指向façade的指针。

5、 协助

  • 客户程序通过发送请求给Façade的方式与子系统通讯,Façade将这些消息转发给适当的子系统对象。
  • 使用Façade的客户程序不需要直接访问子系统对象。

         

6、 效果

Façade模式有以下有点:

1)  它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来方便。

2)  它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。

3)  它并不限制它们使用子系统类,因此可以在系统易用性和通用性之间加以选择。

7、 实现

1)  降低客户—子系统之间的耦合度;用抽象类实现Façade而它的具体子类对应于不同的子系统实现,这可以进一步降低客户与子系统的耦合度。

2)  公共子系统类与私有子系统类;一个子系统类与一个类的相似之处是,它们都有接口并且它们都封装了一些东西——类封装了状态和操作,而子系统封装了一些类。

8、 相关示例

Model

[java]  view plain copy
  1. package com.examples.pattern.facade;  
  2.   
  3. public interface IModel_A {  
  4.     public void testA();  
  5. }  
[java]  view plain copy
  1. package com.examples.pattern.facade;  
  2.   
  3. public class Model_A_impl implements IModel_A {  
  4.   
  5.     @Override  
  6.     public void testA() {  
  7.         System.out.println("这是模块A的测试代码...");  
  8.     }  
  9.   
  10. }  
[java]  view plain copy
  1. package com.examples.pattern.facade;  
  2.   
  3. public interface IModel_B {  
  4.     public void testB();  
  5. }  
[java]  view plain copy
  1. package com.examples.pattern.facade;  
  2.   
  3. public class Model_B_impl implements IModel_B {  
  4.   
  5.     @Override  
  6.     public void testB() {  
  7.         System.out.println("这是模块B的测试代码...");  
  8.     }  
  9.   
  10. }  
[java]  view plain copy
  1. package com.examples.pattern.facade;  
  2.   
  3. public interface IModel_C {  
  4.     public void testC();  
  5. }  
[java]  view plain copy
  1. package com.examples.pattern.facade;  
  2.   
  3. public class Model_C_impl implements IModel_C {  
  4.   
  5.     @Override  
  6.     public void testC() {  
  7.         System.out.println("这是模块C的测试代码...");  
  8.     }  
  9.   
  10. }  

Façade

[java]  view plain copy
  1. package com.examples.pattern.facade;  
  2.   
  3. public class Facade {  
  4.   
  5.     public void test() {  
  6.   
  7.         IModel_A ma = new Model_A_impl();  
  8.         ma.testA();  
  9.         IModel_B mb = new Model_B_impl();  
  10.         mb.testB();  
  11.         IModel_C mc = new Model_C_impl();  
  12.         mc.testC();  
  13.   
  14.     }  
  15.   
  16. }  
Client

[java]  view plain copy
  1. package com.examples.pattern.facade;  
  2.   
  3. public class Client {  
  4.       
  5.     public static void main(String[] args) {  
  6.         new Facade().test();  
  7.     }  
  8.   
  9. }  

9、 相关模式

Abstract Factory模式可以与Façade模式一起使用以提供一个接口,这个接口可用来以一种子系统独立的方式创建子系统对象。Abstract Factory也可以代替Façade模式隐藏那些平台相关的类。

Mediator模式与Façade模式的相似支出是,它抽象了一些已有的类的功能。然而,Mediator的目的是对同事之间的任意通讯进行抽象,通常集中不属于任何单个对象的功能。Mediator的同事对象知道中介者并与它通信,而不是直接与其他同类对象通信。相对而言,Façade模式仅对子系统对象的接口进行抽象,从而使它们更容易使用;它并不定义新功能,子系统也不知道Façade的存在。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值