zoukankan      html  css  js  c++  java
  • ②设计模式 外观模式

    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

    君子性非异也,善假于物也!
  • 相关阅读:
    [CLR via C#]5.2 引用类型和值类型
    Yii easyWechat 开发的时候报错:cURL error 60: SSL certificate problem: unable to get local issuer certificat
    前端浏览器自动刷新神器:Browsersync
    phpStudy 切换版本后没有权限的问题
    最全的CSS浏览器兼容问题
    (转)详解JS位置、宽高属性之一:offset系列
    js 跨域问题
    移动端IOS 固定下方的输入框,点击输入框位置会变的修复
    ie8网页时调用特定的css文件
    Bootstrap如何禁止响应式布局 不适配
  • 原文地址:https://www.cnblogs.com/zhaoCat/p/5958972.html
Copyright © 2011-2022 走看看