`
gstarwd
  • 浏览: 1547838 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

FacadePattern-Java代码实例讲解

阅读更多
Facade Pattern 外观模式
 
提供一个统一的接口去访问多个子系统的多个不同的接口。外观模式定义了一个高层次的接口。

Facade外形类
知道哪写子系统负责处理哪些请求
将客户请求传递给相应的子系统处理

Subsystem 子系统类
实现子系统功能
处理由Facade传来的任务
子系统补用知道Facade,在任何地方页没有引用Facade

demo
额 我觉得这个例子不好。。这个不是简单的封装么?= =到底简单的封装和facadepattern  什么区别 T_T
public class Client {//这个就是所谓的客户端啦~~他要调用interface
    public static void main(String[] args){
        FacadeCuppaMaker cuppaMaker = new FacadeCuppaMaker();
        TeaCup teaCup = cuppaMaker.makeACuppa();
        System.out.println(teaCup);
    }
}


public class FacadeCuppaMaker {//这是个复杂的子系统的对外接口 = =
    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;
    }
}

public class Water {
    boolean waterIsBoiling;
    public Water(){
        setWaterIsBoiling(false);
        System.out.println("纯净的水准备好了");
    }
    public void boilFacadeWater(){
        setWaterIsBoiling(true);
        System.out.println("水在沸腾");
    }
    public void setWaterIsBoiling(boolean isWaterBoiling){
        waterIsBoiling = isWaterBoiling;
    }
    public boolean getWaterIsBoiling(){
        return waterIsBoiling;
    }
}


public class TeaBag {
    public TeaBag(){
        System.out.println("清香的茶包准备好了");
    }
}


public class TeaCup {
    boolean teaBagIsSteeped;
    Water facadeWater;
    TeaBag facadeTeaBag;
    public TeaCup(){
        setTeaBagIsSteeped(false);
        System.out.println("茶杯准备好了");
    }
    public void setTeaBagIsSteeped(boolean isTeaBagSteeped){
        teaBagIsSteeped = isTeaBagSteeped;
    }
    public boolean getTeaBagIsSteeped(){
        return teaBagIsSteeped;
    }
    public void addFacadeTeaBag(TeaBag facadeTeaBagIn){
        facadeTeaBag = facadeTeaBagIn;
        System.out.println("茶包放在茶杯了");
    }
    public void addFacadeWater(Water facadeWaterIn){
        facadeWater = facadeWaterIn;
        System.out.println("水倒入杯子了");
    }
    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(this.getTeaBagIsSteeped()){
            return "一杯又香又浓的茶冲好了!";
        }
        else{
            String tempString = new String("一个杯子");
            if(facadeWater != null){
                if(facadeWater.getWaterIsBoiling()){
                    tempString += "放有沸腾的水 ";
                }
                else{
                    tempString += "放有凉水 ";
                }
            }
            else{
                tempString += "没有放水 ";
            }
            if(facadeTeaBag != null){
                tempString += "有一个茶包";
            }
            else{
                tempString += "没有茶包";
            }
            return tempString;
        }
    }
}
 

 

===================================================

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) {   
      
      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:转换接口功能,从一个接口转换到另一种接口形式;


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/binghuazh/archive/2009/02/06/3866465.aspx

分享到:
评论
2 楼 lt26w 2014-09-04  
理解成门面模式应该比较容易明白吧
1 楼 lt26w 2014-09-04  
看下面的例子比较明白.

相关推荐

    Professional.Java.EE.Design.Pattern

    - 外观模式(Facade Pattern):这是将一组复杂操作封装在单个接口后的简化设计模式,旨在降低系统内部组件间的依赖关系。 - 单例模式(Singleton Pattern):保证一个类只有一个实例,并提供一个全局访问点。在Java...

    Java23种设计模式讲解

    7. 门面模式(Facade Pattern):为子系统中的一组接口提供一个统一的高层接口,使子系统更容易使用。 8. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口。适配器让原本接口不兼容的...

    java与模式.pdf

    根据提供的文件信息,“java与模式.pdf”是一本深入讲解设计原则和常见设计模式的专业书籍,主要面向Java程序员、架构设计师及设计模式爱好者。本书通过55个章节详细介绍了各种编程模式,每个章节均包含了该模式的...

    java设计模式

    7. **门面模式(Facade Pattern)** - 介绍:为子系统中的一组接口提供一个统一的接口。 8. **适配器模式(Adapter Pattern)** - 介绍:将一个类的接口转换成客户期望的另一个接口。 9. **模板方法模式...

    完整版 Java高级教程 Java语言程序设计 第6章 常用设计模式(共25页).ppt

    Java高级教程中的第六章主要讲解了五个常用的设计模式:单态模式、MVC模式、简单工厂模式、门面模式和适配器模式。设计模式是软件工程中经过实践验证的解决常见问题的有效策略,旨在提高代码的可复用性和可维护性。 ...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷1

    pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/flyweight //12.7享元模式 pattern/src/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷9

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷3

    pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/flyweight //12.7享元模式 pattern/src/...

    JAVA设计模式-设计模式公司出品

    5. 门面模式(FACADEPATTERN):门面模式提供了一个统一的接口,用来访问子系统中的一群接口。门面定义了一个高层接口,让子系统更容易使用。 6. 适配器模式(ADAPTERPATTERN):适配器模式将一个类的接口转换成...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    设计模式(包含5个设计模式)含源代码报告.zip

    4. 外观模式(Facade Pattern): 外观模式提供了一个统一的接口,用来访问子系统中的多个接口,使得子系统更容易使用。它隐藏了子系统的复杂性,为客户端提供了一个简单的接口来与子系统交互。外观模式降低了系统的...

    超经典的设计模式讲解

    ##### 第7章 门面模式【Facade Pattern】 **定义**:为子系统中的一组接口提供一个一致的界面。 **应用场景**:当一个系统过于复杂,外部系统需要一个简单的接口与之交互时,可以使用门面模式。 **示例**:可以...

    Java 设计模式

    Java设计模式是面向对象编程中的一个核心概念,它是一套被广泛接受并实践的解决软件设计...对于压缩包文件“JavaDesignPattern”,可能是包含了一些示例代码或者更深入的讲解,读者可以通过解压文件获取更多详细信息。

    java高手真经 (UML建模+设计模式+面向服务架构) 卷10

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷5

    综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷2

    pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/structure/flyweight //12.7享元模式 pattern/src/...

Global site tag (gtag.js) - Google Analytics