java设计模式--结构型模式--外观模式

 1                                             外观模式
 2  概述
 3     为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
 4  
 5  
 6  适用性
 7     1.当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越
 8       复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容
 9       易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。
10       Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需
11       要更多的可定制性的用户可以越过facade层。
12 
13     2.客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客
14       户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
15 
16     3.当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。
17       如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们
18       之间的依赖关系。
19  
20  
21  参与者
22     1.Facade
23       知道哪些子系统类负责处理请求。
24       将客户的请求代理给适当的子系统对象。
25 
26     2.Subsystemclasses
27       实现子系统的功能。
28       处理由Facade对象指派的任务。
29       没有facade的任何相关信息;即没有指向facade的指针。

测试类:

 1 public class Test {
 2     
 3     public static void main(String[] args) {
 4         ServiceA sa = new ServiceAImpl();
 5         ServiceB sb = new ServiceBImpl();
 6         
 7         sa.methodA();
 8         sb.methodB();
 9         
10         System.out.println("========");
11         //facade
12         Facade facade = new Facade();
13         facade.methodA();
14         facade.methodB();
15     }
16 }
1 public interface ServiceA {
2     public void methodA();
3 }
1 public class ServiceAImpl implements ServiceA {
2 
3     public void methodA() {
4         System.out.println("这是服务A");
5     }
6 }
1 public interface ServiceB {
2     public void methodB();
3 }
1 public class ServiceBImpl implements ServiceB {
2 
3     public void methodB() {
4         System.out.println("这是服务B");
5     }
6 }
1 public interface ServiceC {
2     public void methodC();
3 }
1 public class ServiceCImpl implements ServiceC {
2 
3     public void methodC() {
4         System.out.println("这是服务C");
5     }
6 }
 1 public class Facade {
 2 
 3     ServiceA sa;
 4     
 5     ServiceB sb;
 6     
 7     ServiceC sc;
 8     
 9     public Facade() {
10         sa = new ServiceAImpl();
11         sb = new ServiceBImpl();
12         sc = new ServiceCImpl(); 
13     }
14     
15     public void methodA() {
16         sa.methodA();
17         sb.methodB();
18     }
19     
20     public void methodB() {
21         sb.methodB();
22         sc.methodC();
23     }
24     
25     public void methodC() {
26         sc.methodC();
27         sa.methodA();
28     }
29 }