继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Java设计模式(11)----------外观模式

道可
关注TA
已关注
手记 47
粉丝 1万
获赞 1426
1、介绍

外观模式是一种结构型设计模式。在外观模式中,外观类中提供一个或者一组对外的接口。客户端对于复杂系统的访问是通过外观类的接口进行的,从而解除了客户端与复杂系统之间的耦合,隐藏了复杂系统内部的逻辑。

该设计模式主要解决客户端与复杂系统内部子系统的沟通成本高的问题,通过外观类,简化了沟通流程,降低沟通成本。

主要的应用场景有:1、医院的接待员(外观类)。通过接待员,可以实现挂号、缴费和取药等一系列的动作,化繁为简。2、电脑启动。通过按一下启动键就可以启动电脑,而不需要我们挨个的给硬盘、cpu和内存上电。其应用场景,抽象来说,就是存在一个总管或者接待员的角色,帮助我们更高效的进行某种行为或者操作。

2、案例
2.1、背景

智能家居是一个比较火的领域。我们的屋子里边会配置电器(复杂系统),每种电器,比如日光灯,电视,空调,冰箱(子系统)等都具有自己的开关。借助智能家居的思想,我们可以在手机上安装一个app,通过app(外观类)控制如上这些电器的开启和关闭。

2.2、实现

图片描述

定义复杂系统和子系统

/**
 * 电器抽象
 */
public interface appliance
{
    void powerOn();
    void powerOff();
}
public class AirConditioning implements appliance
{
    @Override public void powerOn()
    {
        System.out.println("打开空调。");
    }

    @Override public void powerOff()
    {
        System.out.println("关闭空调。");
    }
}
public class Lamp implements appliance
{
    @Override public void powerOn()
    {
        System.out.println("打开台灯。");
    }

    @Override public void powerOff()
    {
        System.out.println("关闭台灯。");
    }
}
public class Refrigerator implements appliance
{
    @Override public void powerOn()
    {
        System.out.println("打开冰箱。");
    }

    @Override public void powerOff()
    {
        System.out.println("关闭冰箱。");
    }
}
public class TV implements appliance
{
    @Override public void powerOn()
    {
        System.out.println("打开电视。");
    }

    @Override public void powerOff()
    {
        System.out.println("关闭电视。");
    }
}

定义外观类

外观类中形成统一的界面,包含子系统的所有对外功能,用于呈现给客户端使用。

public class App
{
    private Lamp lamp;
    private Refrigerator refrigerator;
    private TV tv;
    private AirConditioning airConditioning;

    public App()
    {
        this.lamp = new Lamp();
        this.refrigerator = new Refrigerator();
        this.tv = new TV();
        this.airConditioning = new AirConditioning();
    }

    public void powerOnAppliance()
    {
        this.airConditioning.powerOn();
        this.lamp.powerOn();
        this.refrigerator.powerOn();
        this.tv.powerOn();
        System.out.println("");
    }

    public void powerOffAppliance()
    {
        this.airConditioning.powerOff();
        this.lamp.powerOff();
        this.refrigerator.powerOff();
        this.tv.powerOff();
        System.out.println("");
    }

    public void powerOnLamp()
    {
        this.lamp.powerOn();
    }

    public void powerOffLamp()
    {
        this.lamp.powerOff();
    }
}

验证程序

/**
 * 验证
 */
public class Demo
{
    public static void main(String[] args)
    {
        App app = new App();
        app.powerOnLamp();
        app.powerOnAppliance();
        app.powerOffLamp();
    }
}

运行结果

打开台灯。
打开空调。
打开台灯。
打开冰箱。
打开电视。

关闭台灯。

Process finished with exit code 0

3、总结

优点:将客户端与复杂系统解耦,简化了使用流程。

缺点:不引入抽象外观类的情况,违背了开闭原则。

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP