Facade Pattern

/* * Facade Pattern(外观模式) *将一组复杂的行为封装起来,通过简单接口来实现统一调用。 *例子:在家里看电影,可能需要一系列步骤:打开dvd,放盘,打开tv,打开音响,调好音调,关灯等诸如此类动作 *如果需要每一个都在客户代码来控制,将来修改或者维护比较麻烦,但是如果将这些统一通过facade模式封装到一个 *watchMovie接口中,客户知道我只需按watchMovie就会形成一系列动作,具体干什么可以不清楚。另外对于被封装的类 *具体使用并没受到影响,依然可以自己打开tv,打开hifi等。 * *在Head First中提到一个 *Least Knowledge Principle:talk only to your immediate friends; *这个原则是说:向直接的类保持联系,不必要的可以封装起来,通过一个封装类统一打交道; *其中head First指出几个guidelines * *only invoke methods that belong to: *1)The object itself; //方法属于本身 *2)objects passed in as a parameter to the method //方法是属于参数传入的对象 类似setParam(ClassA ca) ca.methods() *3)any object the method creates or instantiates //方法属于内部创建的实例。 *4)any components of the object //对象的组成成分 * * */ class TV{ public void on(){ System.out.println("TV On"); } public void off(){ System.out.println("TV Off"); } } class DvDplayer{ private String str; public void on(){ System.out.println("DvD On"); } public void off(){ System.out.println("DvD Off"); } public void setDvD(String DvDstr){ str = DvDstr; System.out.println("DvD setDvD " + str); } public void popDvD(){ System.out.println("DvD popDvD "+str); str = ""; } } class HiFi{ private int v; public void turnUp(){ v += 10; System.out.println("HiFi turnUp to "+10); } public void turnDown(){ v -= 10; System.out.println("HiFi turnDown to " + 10); } public void On(){ System.out.println("HiFi On"); } public void Off(){ System.out.println("HiFi Off"); } } class myFacade{ private HiFi hifi; private DvDplayer dvd; private TV tv; public myFacade(HiFi h,DvDplayer d,TV t){ hifi = h; dvd = d; tv = t; } public void watchMovie(String strDvD){ tv.on(); //一系列行为调用 hifi.On(); hifi.turnUp(); dvd.on(); dvd.setDvD(strDvD); } public void stopWatchMovie(){ hifi.Off(); dvd.popDvD(); dvd.off(); tv.off(); } } public class FacadeTest { /** * @param args */ public static void main(String[] args) { // TODO 自动生成方法存根 HiFi h = new HiFi(); TV t = new TV(); DvDplayer dvd = new DvDplayer(); myFacade mf = new myFacade(h,dvd,t); mf.watchMovie("War II"); //关心看电影,不关心电影通过怎样操作才可以看到 mf.stopWatchMovie(); } }

 

有些关于Decorator Pattern ,Facade Pattern,Adapter Pattern比较:

从它们的目的来比较:

Decorator Pattern:动态添加一些额外功能;

Facade Pattern:封装功能,使一系列复杂动作通过简单接口公开;

Adapter Pattern:转换接口功能,从一个接口转换到另一种接口形式;

 

 

你可能感兴趣的:(Decorator,String,object,Class,methods,Components)