关于设计模式:设计模式第十篇外观模式开着小破车的快乐

32次阅读

共计 3854 个字符,预计需要花费 10 分钟才能阅读完成。

一 开着小破车的高兴

不晓得大家有没有这样开或者坐过这样一辆“小破车”,他能跑,然而外部娱乐或者说一些辅助的设施简直能够忽略不计,条件尽管艰辛了一些,然而咱们还是要本人给本人发明高兴,夏天太热了,先给本人装置一台空调,害,其实就是一台小电扇,接着就是咱们的 360 度音响体验了,其实也就是一个低音炮,来吧,最侈靡的一个设施来了,遮光板上接一个屏幕,还能连一个简略的 DVD 机器,好的吧,麻雀虽小,然而也算五脏俱全了,就像代码一样,毕竟有性能,能运行的程序就是“好程序”对吧哈哈哈~

(一) 小破车的辛酸

上车,关上我的小电扇,关上小音响,再放好 DVD,就能够动员小破车登程了,下车的时候熄掉火,顺次关掉 DVD,音响,电扇,就能够进来了,尽管满满的典礼感,然而因为这些外接的设施都是一个一个独立的,所以不论是开启敞开,我都须要顺次对其进行操作,本人忙了一天再回来在上折腾这个,别提多懊恼了

真艳羡他人的“奢华”小轿车,上车当前,一键打火,所有配套设施主动启动,凉飕飕的空调,动感的音乐

空想着,我能不能也将我的小破车,改装成“智能”的模样呢?

上面咱们就用代码来看一下咱们的小破车设施革新

(二) 革新我的小破车

先复现一下我那些 DVD、音响等等原来的状态

阐明:这里只是为了演示,就在单线程环境下,简略的用了饿汉式单例,空调也就是下面说的小电扇,权且这么叫好了

/**
 * 空调设备
 */
public class AirConditioner {
    // 饿汉式单例
    private static AirConditioner instance = new AirConditioner();

    public static AirConditioner getInstance() {return instance;}

    public void turnOn() {System.out.println("开启空调");
    }

    public void turnOff() {System.out.println("敞开空调");
    }
}

这是音响

/**
 * 音响设备
 */
public class Sound {
    // 饿汉式单例
    private static Sound instance = new Sound();

    public static Sound getInstance() {return instance;}

    public void turnOn() {System.out.println("开启音响");
    }

    public void turnOff() {System.out.println("敞开音响");
    }

}

这是 DVD

public class DVDPlayer {
    // 饿汉式单例
    private static DVDPlayer instance = new DVDPlayer();

    public static DVDPlayer getInstance() {return instance;}

    public void turnOn() {System.out.println("开启 DVD");
    }

    public void turnOff() {System.out.println("敞开 DVD");
    }

}

如果应用传统的形式测试一下

public class Test {public static void main(String[] args) {
        // 拿到三种设施的实例
        AirConditioner airConditioner = AirConditioner.getInstance();
        DVDPlayer dvdPlayer = DVDPlayer.getInstance();
        Sound sound = Sound.getInstance();

        System.out.println("===== 开启的过程 =====");
        airConditioner.turnOn();
        dvdPlayer.turnOn();
        sound.turnOn();
        
        System.out.println("===== 敞开的过程 =====");
        airConditioner.turnOff();
        dvdPlayer.turnOff();
        sound.turnOff();}
}

测试后果

===== 开启的过程 =====
开启空调
开启 DVD
开启音响
===== 敞开的过程 =====
敞开空调
敞开 DVD
敞开音响

成果没问题了,然而能够看进去,只有短短三台设施的开关就须要执行 6 个办法,如果设施更多一些,如果操作不仅只有开关,还有一些别的,岂不是要累死,尽管咱的车是破旧了一些,但这也太折腾了

来吧,革新!

咱们创立一个 CarFade 外观类,将这些细节内容都封装进去

public class CarFacade {
    private AirConditioner airConditioner;
    private DVDPlayer dvdPlayer;
    private Sound sound;

    // 在无参结构中拿到实例
    public CarFacade() {this.airConditioner = AirConditioner.getInstance();
        this.dvdPlayer = DVDPlayer.getInstance();
        this.sound = Sound.getInstance();}
    
    // 一键开启
    public void turnOn() {airConditioner.turnOn();
        dvdPlayer.turnOn();
        sound.turnOn();}
    
    // 一键敞开
    public void turnOff() {airConditioner.turnOff();
        dvdPlayer.turnOff();
        sound.turnOff();}
}

再看看如何测试呢

package cn.ideal.facade;

/**
 * @ClassName: Test
 * @Author: BWH_Steven
 * @Date: 2020/11/27 11:35
 * @Version: 1.0
 */
public class Test {public static void main(String[] args) {
          // 拿到三种设施的实例
        CarFacade carFacade = new CarFacade();

        System.out.println("===== 开启的过程 =====");
        carFacade.turnOn();

        System.out.println("===== 敞开的过程 =====");
        carFacade.turnOff();}
}

测试后果:

===== 开启的过程 =====
开启空调
开启 DVD
开启音响
===== 敞开的过程 =====
敞开空调
敞开 DVD
敞开音响

成果一样没问题,然而咱们作为调用者,这可难受了,咱们也能够一键开关这些娱乐辅助设施了,其实这就是利用了一种简略实用的设计模式——外观模式,上面来一起看看它的概念

二 外观模式实践

(一) 概念

外观模式(门面模式):它是一种通过为多个简单的子系统提供一个统一的接口,而使这些子系统更加容易被拜访的模式

就着下面的例子也很好了解,空调、印象、DVD,就是一个一个简单的子系统,而咱们为这几者,提供一个统一的 CarFacade,咱们就防止去拜访一个一个子系统的具体细节,而只须要执行,这个 CarFacade 提供给咱们对外的一个办法,其实就是达到了一个封装,精简的成果

还有例子,例如在生活中要去办户口或者注册公司等等,咱们往往须要往返于多个部门之间,到处开证实,办手续,然而如果有一个综合性质的部门,对立办理对应的业务,对于用户来说就毋庸来回奔波,只须要依据这个综合局部对外的窗口,提交指定的资料,期待其帮你办理即可

再回到代码上,其实咱们在平时的开发中曾经无意或者无心的应用到了外观模式,例如高层的模块中,咱们想要调用多个绝对简单的子系统,咱们为了 精简接口的数量,个别都会再创立一个新的类,对其进行调用封装,而后使得最终调用者,能够更加简洁容易的调用这些子系统的性能

(二) 构造

仍旧剖析一下其角色:

  • 外观(Facade)角色:为多个子系统对外提供一个独特的接口或者说统一的界面,使得这些子系统更加好应用
  • 子系统(Sub System)角色:实现零碎的局部性能,它们其实才是咱们真正想要拜访的内容,客户能够通过外观角色拜访它
  • 客户(Client)角色:通过一个外观角色拜访各个子系统的性能

(三) 优缺点

(1) 长处

  • 简化了调用过程:只须要拜访外观模式给出的对外接口即可实现调用
  • 封装性更好:应用外观模式,子系统性能及具体细节被暗藏了起来,封装性更好
  • 耦合性升高:调用者只与外观对象进行交互,不间接与子系统进行接触,升高了对子系统的依赖程序,升高了耦合
  • 合乎迪米特法令

(2) 毛病

  • 不能很好的躲避扩大危险:零碎外部扩大子系统的时候,容易产生危险
  • 违反开闭准则:扩大子系统的时候,可能须要批改外观类,会违反开闭准则

(四) 什么时候应用外观模式

(1) 档次简单

咱们在开发初期,会无意识的应用一些常见一些架构形式,例如 MVC 等等,在层级和业务很简单的状况下,就须要思考在每个层级都创立一个外观对象作为入口,这样就能够为简单的子系统提供一些简略的接口

(2) 子系统多且简单

咱们一直的更新,扩大一些性能,就会导致有很多细小却又缺不得的类,或者有一些非常复杂的零碎,例如蕴含很多个类,这个时候咱们能够思考创立一个外观 Facade 类,简化接口,升高它们之间的依赖

(3) 调用老旧零碎性能

有一些老旧的零碎,简直曾经没有保护扩大的价值对了,然而其中又有一些牵扯很大的外围性能,咱们在新零碎中又没有足够的精力和老本去重构,只能设计一个外观 Facade 类,来交互新旧零碎的代码

正文完
 0