设计模式之外观设计模式

1,622 阅读4分钟

PS:输入倒逼输出,想持续输出就得持续输入,每天的坚持很小,但是如果坚持一年呢,甚至更长时间呢,结果不一定很美好,但是过程一定很充实。

今天温习一下外设计模式,可以选择阅读同系列文章:

提到外观设计模式,就不得不提到设计模式的六大原则之一的迪米特法则,本篇文章将从如下几个方面介绍外观设计模式:

  1. 迪米特法则
  2. 如何理解外观设计模式
  3. 实现外观设计模式

迪米特法则

开发中经常会遇到类与类之间的关系越来越密切,耦合越来越大,导致当一个类发生变化时也会影响其他类,在设计模式六大原则中迪米特法则就是用来规范这种现象的,那什么是迪米特法则呢?

迪米特法则(Law of Demeter)又叫做最少知识原则(LKP,Least Knowledge Principle),就是说一个对象应当对其他对象保持最少的了解。

迪米特法则还有一个更简单的定义:只与直接的朋友进行通信,解释一下什么是直接的朋友,两个对象之间是耦合关系,我们就说这两个对象之间是朋友关系,耦合的关系有依赖、组合、聚合等,把出现成员变量、方法参数、方法返回值的类称为直接的朋友,而 出现在局部变量中的对象则不是直接朋友,也就是说陌生的类最好不要出现在局部变量中。

如何理解外观设计模式

外观设计模式实际在开发中已经在使用,只是在潜意识里没有外观设计模式这个概念,比如为了方便调用而对一些功能进行封装,最后在一个管理类中统一对外提供,大多数工具类都应该用到了外观设计模式。

归根到底,外观设计模式就是对一些广泛用到的功能进行封装,避免这部分内容频繁的与其他对象产生耦合关系,通过封装统一子系统的复杂性,只对外提供一个入口,以便其他模块调用,这个是外观设计模式的核心。

实现外观设计模式

场景:茶馆中有 A 、B、C 等顾客都需要泡茶喝,而且每个顾客每次泡茶的时候都得经过如下步骤才能泡好茶:

  1. 备具
  2. 备水
  3. 冲泡

每个顾客每次泡茶的时候都与茶具、茶叶、沸水等接触,这明显不符合迪米特法则,可以通过外观设计模式封装泡茶这个流程,也就是茶馆里面的服务员,每次喝茶的时候直接告诉茶馆服务员想喝什么茶就可以了,其他的泡茶细节顾客不需要知道,只要能够喝到想要的茶就对了,下面使用这个案例额简单实现一下外观设计模式。泡茶流程如下:

/**
 * 备具
 * Created by jzman
 * Powered by 2019/5/6.
 */
interface IPrepareTeaSet {
    void prepareTeaSet();
}

class PrepareTeaSet implements IPrepareTeaSet {
    @Override
    public void prepareTeaSet() {
        System.out.println("备具...");
    }
}

/**
 * 备水
 * Created by jzman
 * Powered by 2019/5/6.
 */
interface IPrepareWater {
    void prepareWater();
}

class PrepareWater implements IPrepareWater {
    @Override
    public void prepareWater() {
        System.out.println("备水...");
    }
}

/**
 * 冲泡
 * Created by jzman
 * Powered by 2019/5/6.
 */
interface IBrewMethod {
    void brewMethod(String tea);
}

class BrewMethod implements IBrewMethod {

    @Override
    public void brewMethod(String tea) {
        System.out.println("冲泡..."+tea);
    }
}

对泡茶服务进行统一封装对外提供泡茶服务,如下:

/**
 * 茶馆泡茶服务
 * Created by jzman
 * Powered by 2019/5/6.
 */
class TeaHouse {
    // 统一泡茶服务
    public static void drinkTea(String tea){
        // 备具
        new PrepareTeaSet().prepareTeaSet();
        // 备水
        new PrepareWater().prepareWater();
        // 冲泡
        new BrewMethod().brewMethod(tea);
    }
}

最后顾客想喝什么茶就点什么茶,如下:

/**
 * 测试
 * Created by jzman
 * Powered by 2019/5/6.
 */
class FacadeMain {
    public static void main(String[] args) {
        // A
        TeaHouse.drinkTea("红茶");
        // B
        TeaHouse.drinkTea("乌龙茶");
    }
}

执行日志如下:

备具...
备水...
冲泡...红茶

备具...
备水...
冲泡...乌龙茶

外观设计模式的学习就到此为止,虽然平时的业务开发中也可能这样写,但是在潜意识里面肯定不知道迪米特法则和外观设计模式,通过输入这样的概念,就会在潜意识里面去实践这样的规则。并不断提高自己的编码能力。