首页 > 代码库 > ②设计模式 外观模式

②设计模式 外观模式

1.生活中的示例

客户想要购买一台电脑,一般有两种方法:

1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高。

2.去电脑组装公司,告诉他们你需要的电脑配置,再由电脑组装公司的人来组装电脑,这种方式比较简单通用,现实中一般也是这个样子。

如图所示:

技术分享

                                                          DIY

技术分享

 

                                                      交给装机公司

2.从示例中联想编程

显然,DIY要求客户熟悉各配件的使用,联想到编程上就是客户端直接调用各个模块完成所需功能,对于客户端来说显得很麻烦。

卖CPU的公司、卖主板的公司。。。在代码中可以理解为小的模块,装机公司即为这次学习的主角“外观”。

技术分享

                                                    结合编程

3.外观模式的定义

为子系统中的组接口提供一个一致的界面,Facade模式定义了一个高层接口(不只是Interface),这个接口使得这一子系统更加容易使用

接口:这里的接口不一定是Interface,也有可能是一个方法,提供外部和内部交互的通道。

界面:主要指的是从一个组件外部来看这个组件,能看到什么(只能看到Facde中封装的方法),这就是组件的界面,也就是组件的外观。

4.外观模式解决的主要问题

使客户端操作更加简单。

5.编程思路

通过引入一个外观类,在这个类里面定义客户端需要的方法,在这些方法中分别调用多个模块来实现某一个功能,从而使得客户端变得简单。

6.类图

技术分享

7.代码

子系统代码(模块)

技术分享
public interface Model1Api {    public void test1();}
Model1Api
技术分享
public class Model1Impl implements Model1Api {    public Model1Impl(){    }    public void finalize() throws Throwable {    }    public void test1(){        System.out.println("启动了Model1模块");    }}
Model1Impl
技术分享
public interface Model2Api {    public void test2();}
Model2Api
技术分享
public class Model2Impl implements Model2Api {    public Model2Impl(){    }    public void finalize() throws Throwable {    }    public void test2(){        System.out.println("启动了Model2模块");    }}
Model2Impl
技术分享
public interface Model3Api {    public void test3();}
Model3Api
技术分享
public class Model3Impl implements Model3Api {    public Model3Impl(){    }    public void finalize() throws Throwable {    }    public void test3(){        System.out.println("启动了Model3模块");    }}
Model3Impl

外观

技术分享
public class Facade {    public Facade(){    }    public void finalize() throws Throwable {    }    public static void test(){        Model1Api m1 = new Model1Impl();        Model2Api m2 = new Model2Impl();        Model3Api m3 = new Model3Impl();        m1.test1();        m2.test2();        m3.test3();    }}
Facade

客户

技术分享
public class Client {    public Client(){    }    public void finalize() throws Throwable {    }    /**     *      * @param args     */    public static void main(String[] args){        Facade.test();    }}
Client

8.外观模式的目的

外观模式的目的不是给子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能更简单的使用子系统。虽然可以在外观类内定义一些子系统没有的功能,但不建议这样做,外观类的主要作用就是组装已有的功能来实现用户需要,而不是添加新的实现。

9.Facade也可以实现成为Interface

这样做会增加系统的复杂度,因为这样做还需要一个Facade的实现和一个获取Facade接口对象的工厂,客户端通过这个工厂才成生成需要的Facade接口对象。但是这样做的好处是,能够有选择性的暴露接口的方法

10.外观模式的优缺点

优点:

1.松散耦合:降低了客户端与子系统的耦合关系,使得子系统的各个模块扩展性和可维护性增强。

2.简单易用:客户端更容易使用功能。

3.更好的划分访问的层次:把暴露给外部的功能集中到外观中,这样既方便了客户端,又隐藏了内部的具体实现细节。

缺点:

过多的或者不合理的使用Facade也容易让人迷惑,到底调用Facade好还是直接调用模块好。

11.总结

外观模式作用就是组装,将子系统多个模块以某种方式拼装到一起,客户端调用时只需要调用外观类的方法就可以得到自己想要的功能。并且,客户端无需知道如何组装以及实现细节,简化了客户端的操作。有选择的暴露接口方法,方便划分访问的分层

 

 ------博主写博客不容易,转载请注明出处,谢谢:http://www.cnblogs.com/xiemubg/p/5945720.html

②设计模式 外观模式