zoukankan      html  css  js  c++  java
  • 设计模式详解——外观模式

    前言

    今天我们来看另一个改变接口的设计模式,不过它改变接口的原因是为了简化接口。这个模式被巧妙地叫做外观模式,之所以这么称呼,是因为它将一个或多个类的复杂的实现都藏在了背后,只显露出一个干净美好的外观。好了,下面我们就来展开分享下。

    外观模式

    外观模式提供了一个统一的接口,用来访问子系统中的一群接口,它定义了一个高层接口,让子系统更容易使用。下面是外观模式的一个模型图,核心的元素有三个,一个客户端,一个外观模式,另一块是很繁杂的子系统,其中外观模式这一层,主要是简化子系统的接口,为客户端提供更简洁的调用:

    要点

    • 当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观模式
    • 实现一个外观模式,需要将子系统组合进外观中,然后将工作委托给子系统执行
    • 外观将客户从一个复杂的子系统中解耦

    示例代码

    下面我们通过一个很形象的日常生活示例,来说明外观模式具体的应用场景。

    我们可以想象这样一个场景:下班回到家,你想看个电影,放松一下,但是你并没有感觉到很开心。因为考虑到要拖地,而且家里水壶还没水了,你还要烧个热水,还有自己找电影,想到这一切的一切,你突然放弃了想看电影的想法。

    因为在正常情况下,每一步都要自己亲自操作:首先先打开家里的扫地机器人(这已经算高端了),然后接水烧水,之后才能打开电脑、找电影,整个过程操作完之后,你才能开始看电影,但是这时候你可能会感觉到更加疲惫。

    但是假如,突然有一天你的生活开启了外观模式,那整个场景就完全不一样了。这时候回到家,你只需要一键操作,扫地、烧水、找电影都可以一气呵成,这样你就可以直接看自己喜欢的电影了,岂不是美滋滋!

    下面我们就来详细看下这个一气呵成的方法,具体如何用代码来实现:

    扫地操作

    正常情况下,你要自己用扫把扫地,如果是扫地机器人的话,你至少需要启动下开关

    public class Broom {
        public void sweepFloor() {
            System.out.println("扫帚正在扫地!");
        }
    }
    
    烧水操作

    烧水操作也一样,你要用水壶接水,然后烧水

    public class Kettle {
        public void boilWater() {
            System.out.println("烧水壶正在接水!");
            System.out.println("烧水壶正在烧水!");
        }
    }
    
    搜索电影操作

    紧接着你还要自己搜索电影,然后才能开始看电影

    public class Computer {
        public void searchVideo() {
            System.out.println("电脑正在查找电影!");
            System.out.println("电脑查找电影完成!");
        }
    }
    
    外观模式

    但是如果你的生活启用了外观模式,仅需一键操作,就可以完成以上操作,同时开始看电影,感觉这个痛苦的过程一下就消失了呢,是不是一下就感觉美滋滋了呢!

    public class SystemFacade {
        Broom broom = new Broom();
        Kettle kettle = new Kettle();
        Computer computer = new Computer();
    
        public void facade() {
            broom.sweepFloor();
            kettle.boilWater();
            computer.searchVideo();
            System.out.println("开始播放电影!");
        }
    }
    
    测试代码

    好了,下面就让我们来一键操作吧!

    	 @Test
        public void testFacade() {
            SystemFacade facade = new SystemFacade();
            facade.facade();
        }
    

    然后我们就可以愉快地看电影了:

    和适配器比较

    • 外观模式不只是简化了接口,也将客户从组件的子系统中解耦
    • 外观模式和适配器模式可以包装许多类,但是外观模式的意图是简化接口,而适配器的意图是将接口转换成不同的接口

    总结

    从上面的示例代码,以及我们举的生活中的例子,我们可以很清楚地看到,外观模式本质上就是整合接口,为客户端提供一个更简洁的接口。现实生活中,外观模式的例子还有很多,特别是在现在这种智能时代,比如小爱同学、小度以及我们的手机智能助手等,都是典型的外观模式。从这一点上来讲,人工智能确实改变了我们的生活,让生活的繁杂开始变得简单,语音搜索、语音控制各类电器……万物互联,真的是指日可待!

    好了,关于外观模式我们就说这么多,总体来看这块的内容也确实不过。

  • 相关阅读:
    塔防游戏 代码project as 分享
    iOS网络监控— BMReachability
    Oracle学习(五):多表查询
    Servlet之生命周期【入门版(刚開始学习的人必看)】
    mysql 流程函数 存储引擎 InnoDB简单特性
    js
    UVa 10245
    Ubuntu14.04怎样使用root登录
    leetCode(29):Happy Number
    WebService:asp.net类库中添加WebService引用出现问题解决方法
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/15412919.html
Copyright © 2011-2022 走看看