外观(门面)模式-Java实现

createh55个月前 (01-06)技术教程72

定义


外观模式(Facade Pattern),也叫门面模式,原始定义是:为了子系统中的一组接口提供统一的接口。定义一个更高级别的接口,使子系统更易于使用。


大大降低应用程序的复杂度,提高了程序的可维护性。


?编辑


结构图



代码演示


智能家电控制


通过智能音箱来控制室内的灯、电视、空调,本来每个设备都需要进行独立的开关操作,现在通过智能音箱来完成对这几个设备的统一控制


类图如下



代码


public class SmartApplicationFacade {
    private Light light;
    private TV tv;
    private AirCondition airCondition;
    public SmartApplicationFacade() {
        this.light = new Light();
        this.tv = new TV();
        this.airCondition = new AirCondition();
    }
    public void say(String msg) {
        if (msg.contains("打开")) {
            on();
        } else if (msg.contains("关闭")) {
            off();
        } else {
            System.out.println("对不起没有听清楚您说什么!请重新说一遍");
        }
    }
    private void off() {
        System.out.println("睡觉了");
        light.off();
        tv.off();
        airCondition.off();
    }
    private void on() {
        System.out.println("起床了");
        light.on();
        tv.on();
        airCondition.on();
    }
}



总结


  • 优点


  1. 对客户端屏蔽子系统,减少客户端需要处理的对象数目,使子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少
  2. 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可
  3. 一个子系统的修改对其他子系统没有任何影响,而子系统内部变化也不会影响到外观对象。


  • 缺点


  1. 不能很好的控制客户端直接使用子系统类,如果客户端访问子系统类做太多限制则减少了可变性和灵活性。
  2. 如果设计不当,增加了新的子系统则可能需要修改外观类的源代码,违背了开闭原则。


  • 使用场景


  1. 简化负载系统。比如,当我们开发了一整套的电商系统后(包括订单、商品、支付、会员等系统),我们不能让用户依次使用完这些系统后才完成商品的购买,而是需要一个门户网站或手机App这样的简化过的门面系统来提供在线的购物功能;
  2. 减少客户端处理的系统数量。比如,在Web应用中,系统与系统之间的调用可能需要处理Database数据库、Model业务对象等,其中使用Dadbase数据库就需要处理打开数据库、关闭连接等操作,然后转换为Model业务对象,实在是太麻烦了。如果能够创建一个数据库使用的门面(其实就是常说的dao层),那么实现以上过程将变得容易很多。
  3. 联合更多的系统来扩展原有系统。当我们的电商系统中需要一些新功能时,比如,人脸识别,我们可以不需要自行研发,而是购买别家公司的系统来提供服务,这时通过门面系统就能方便快速的进行扩展。
  4. 作为一个简洁的中间层。门面模式还可以用来隐藏或者封装系统中的分层结构,同事作为一个简化的中间层来使用。比如,在秒杀、库存、钱包等场景中,我们需要共享有状态的数据库时(如商品库存、账户里的钱),在不改变原有系统的前提下,通过一个中间的共享层(如将秒杀活动的商品库存总数统一放在redis中),就能统一进行各种服务(如秒杀详情页、商品详情页、购物车等)的调用。

?

相关文章

小高分享(63)Java中的图形、图像与音频

分享兴趣,传播快乐,增长见闻,留下美好!亲爱的您,这里是LearningYard新学苑。今天小编为你带来小高分享(63)Java中的图形、图像与音频欢迎您的访问!Share interests, sp...

使用Java技术实现系统拖拽画页面并生成Vue代码的方法!技术分析

Java语言本身不直接支持生成Vue代码,但可以通过使用Java的代码生成工具或库来实现这一目标。对于实现系统拖拽来画页面的功能,可以考虑使用JavaFX或Swing等GUI工具包来构建可视化界面,并...

Java 图像处理(一)

 曾几何时,Java图像处理已经被认为是太过鸡肋,就连Java的创始公司,在java图像处理方面也是浅尝辄止,可能相比较C++,Java在这方面的处理,确实差强人意。不过Java类库中有一个叫JAI的...

基于Java的壁纸网站+vue

ssm665基于Java的壁纸网站设计与实现+vue绪论课题背景身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使...

这款工具太实用了!一键搞定JAR包的反编译、动态调试、漏洞检测

工具简介Jar-Analyzer是一款功能强大的 JAR 包分析工具,支持批量分析、SCA 漏洞检测、方法调用关系搜索、字符串搜索、Spring 组件分析、信息泄露检查等多种功能。此外,还支持CFG...

pascal——一个开发图形界面相当牛逼的语言

用纯pascal语言开发一个功能简单的程序,其大小基本在178kb左右。但是用C语言开发功能相同的程序,其大小只有17kb左右,是pascal语言开发的程序的1/10大小,可见C语言的机器代码质量是相...