对外观模式的理解

一、场景【案例来源

1 题目描述

小明家的电源总开关控制了家里的三个设备:空调、台灯和电视机。每个设备都有独立的开关密码,分别用数字1、2和3表示。即输入1时,空调关闭,输入2时,台灯关闭,输入3时,电视机关闭,当输入为4时,表示要关闭所有设备。请你使用外观模式编写程序来描述电源总开关的操作。

2 输入描述

第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。
接下来的 N 行,每行包含一个数字,表示对应设备的开关操作(1表示关闭空调,2表示关闭台灯,3表示关闭电视机,4表示关闭所有设备)。

3 输出描述

输出关闭所有设备后的状态,当输入的数字不在1-4范围内时,输出Invalid device code.

4 输入示例

4
1
2
3
4

5 输出示例

Air Conditioner is turned off.
Desk Lamp is turned off.
Television is turned off.
All devices are off.

二、如果不采用外观模式

1、实现

  • 客户端:
public class Application {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            int code = scanner.nextInt();
            switch (code) {
                case 1:
                    new AirConditioner().off();
                    break;
                case 2:
                    new DeskLamp().off();
                    break;
                case 3:
                    new Television().off();
                    break;
                case 4:
                    new AllDevice().off();
                    break;
                default: throw new RuntimeException("Invalid code, code must in [1, 4]");
            }
        }
    }
}
  • 子系统1(空调AirConditioner):
public class AirConditioner {
    public void off() {
        System.out.println("Air Conditioner is turned off.");
    }
}
  • 子系统2(台灯DeskLamp)
public class DeskLamp {
    public void off() {
        System.out.println("Desk Lamp is turned off.");
    }
}
  • 子系统3(台灯Television)
public class Television {
    public void off() {
        System.out.println("Television is turned off.");
    }
}
  • 子系统4(所有设备AllDevice)
public class AllDevice {
    public void off() {
        System.out.println("All devices are off.");
    }
}

2、问题

  • 客户端的代码要尽可能抽象,而非具体。否则,当增加一个子系统时,或者关闭设备改为打开设备时,我们不得不修改客户端代码。

三、采用外观模式

  • 外观是一种结构型设计模式, 对各种子系统(可以简单理解为用到的类)进行封装,并提供一个简单 (但有限) 的接口供客户端调用。

1、实现

  • 客户端:
@ComponentScan
public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Application.class);
        DeviceOffFacade deviceOff = applicationContext.getBean(DeviceOffFacade.class);

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            int code = scanner.nextInt();
            deviceOff.off(code);
        }
    }
}
  • 外观类:
@Component
public class DeviceOffFacade {
    @Autowired
    private AirConditioner airConditioner;

    @Autowired
    private DeskLamp deskLamp;

    @Autowired
    private Television television;

    @Autowired
    private AllDevice allDevice;

    public void off(int code) {
        switch (code) {
            case 1:
                airConditioner.off();
                break;
            case 2:
                deskLamp.off();
                break;
            case 3:
                television.off();
                break;
            case 4:
                allDevice.off();
                break;
            default: throw new RuntimeException("Invalid code, code must in [1, 4]");
        }
    }
}

2、优点

  • 实际开发中,通过Spring注入各种子系统的bean(如上所示),然后将这些相关bean封装在一个外观类中。可以简化客户端调用各种子系统的代码。
  • 如果当前的DeviceOffFacade不满足需求,例如,新需求:当人回家时,智能门检测到住户的人脸后,先开客厅的灯,然后打开客厅的窗帘等。我们可以定义新的外观类,如DeviceArrangeFacade,提供一个arrange(xxx)方法。

四、个人思考

  • 这应该是我学过的最简单的设计模式了… 思想极其纯粹。在实际开发中,不知不觉就应用过这种设计模式,将屎山代码做一下简单的封装,这样闻起来就没那么臭了:)。
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值