设计模式学习--------4.外观模式学习

场景:

         当客户端访问一个子系统中的多个子模块的方法时,既能简单的使用这些子系统内部的模块功能,而又不用客户端

与子系统内部的多个模块交互.

        比如举办一个会议,需要首先预约时间,然后准备会议室,接着就是开会,最后是总结会议成果。如果没有助理,这些

情我都要自己去一个一个亲自去准备,并且必须知道每一步的具体步骤,这样不但增加了我开会所用的时间也增加了

次会议的复杂度。所以我希望有助理能帮我处理这个会议的步骤,然后助理指派手下的4个实习生去准备,实习生A

来负责预约时间,实习生B负责准备会议室,实习生C负责召集开会人员,实习生D负责会议总结,这个助理就是这样一个外

观接口,所有实习生都是负责开会这样一个系统需求的子模块,但有时候我想要进行电话会议,就不需要准备会议室的步

骤,那我直接找A帮忙预约时间打电话就好,也就不需要助理当中间人了.


定义:

        为子系统中的一组接口提供一个一致的界面,Facade(外观)模式定义了一个高层接口,这个接口使得这一子系统

加容易使用。


角色:

       Facade: 定义子系统的多个模块对外的高层接口,通常需要调用内部多个模块,从而把客户的请求代理给适当的子系

统对象

 

package com.kris.study;

public class Facade {
    private Facade(){}
    public static void kaiHui(){
    	new FreshManA().time();
    	new FreshManB().getReady();
    	new FreshManC().start();
    	new FreshManD().summary();
    }
}


       子系统模块:接受Facade对象的委派,真正实现功能,各个模块之间可能有交互。Facade知道各个模块,但是

 

各个模块不一定知道Facade对象。比如实习生只知道助理叫什么,但是不知道她的名字和所负责的工作。

 

package com.kris.study;

public class FreshManA {
    public void time(){
    	System.out.println("预约时间");
    }
}


package com.kris.study;

public class FreshManB {
       public void getReady(){
    	   System.out.println("准备会议室");
       }
}



package com.kris.study;

public class FreshManC {
     public void start(){
    	 System.out.println("举行会议");
     }
}


package com.kris.study;

public class FreshManD {
     public void summary(){
    	 System.out.println("总结");
     }
}




        Client客户端:可以直接和Facade交互也可以单独调用子模块功能

 

 

package com.kris.study;

public class Client {
   public static void main(String[] args) {
	   Facade.kaiHui();
//	   new FreshManA().time();
   }
}


原理分析:

 

      外观模式的目的不是给子系统增加新的功能接口,而是为了让外部减少与子系统内部多个模块的直接交互,松散耦

合,从而让外部能够简单的使用子系统,并且防止重复调用相同的代码.所以Facade的方法本身不进行功能的处理,只是

实现一个功能的组合调用。

      外观模式的本质是:封装交互,简化调用


          



     

 

posted @ 2014-04-12 16:44  Leo的银弹  阅读(156)  评论(0编辑  收藏  举报