likes
comments
collection
share

【设计模式系列】通俗易懂的门面模式

作者站长头像
站长
· 阅读数 13

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

前言

最近同事二狗子要装修房子,他装修之前呢,得先找个设计师设计,然后还需要找个水电工给新房子改水电,再然后,还得找泥瓦工,刷墙贴瓷砖之类的,这个过程中要招人,谈价钱,跟进度,二狗子一个写代码的程序员,他哪会这些呀,太麻烦了,要是有人能帮他干就好了。

【设计模式系列】通俗易懂的门面模式

哎,这事儿好办呀,找个装修公司呀。

【设计模式系列】通俗易懂的门面模式

有了装修公司,二狗子就只需要和装修公司谈好价钱,然后等房子装修就好,不用再操心一些细节。

这和我们今天讲的门面设计模式是一个道理。

门面模式定义

GoF门面设计模式定义:为子系统中的一组接口提供统一的接口。门面模式定义了使子系统更易于使用的高级接口。

门面设计模式(Facade Design Pattern)是结构设计模式中的一种,门面模式的作用是为了帮助客户端更容易地与系统交互。

门面模式结构

我们来看一下,在上面的例子中,都需要有些什么元素。

子系统

在上面的例子中,我们首先需要有设计师,水电工,泥瓦匠这些功能对应的接口,供门面(装修公司)来使用。

设计师

/**
 * @author 小黑说Java
 * @ClassName Designer 
 * @Description 设计师
 * @date 2021/11/14
 **/
public class Designer {

    public void design() {
        System.out.println("设计师设计");
    }
}

水电工

/**
 * @author 小黑说Java
 * @ClassName WaterElectricWorker
 * @Description 水电工
 * @date 2021/11/14
 **/
public class WaterElectricWorker {

    public void work() {
        System.out.println("水电工修水电");
    }
}

泥瓦工

/**
 * @author 小黑说Java
 * @ClassName bricklayer
 * @Description 泥瓦工
 * @date 2021/11/14
 **/
public class Bricklayer {

    public void work() {
        System.out.println("泥瓦匠贴瓷砖");
    }
}

门面

然后我们建立一个门面类,也就是装修公司。

/**
 * @author 小黑说Java
 * @ClassName DecorationCompany
 * @Description 装修公司
 * @date 2021/11/14
 **/
public class DecorationCompany {

    public static void decorate() {
        System.out.println("装修公司整合~");
        new Designer().design();
        new WaterElectricWorker().work();
        new Bricklayer().work();
        System.out.println("装修完毕");
    }
}

在我的同事二狗子就可以来进行装修了,我们来看一下二狗子使用门面和不使用门面的不同实现方式。

public class DecorationTest {

    public static void main(String[] args) {
        // 不使用门面模式
        new Designer().design();
        new WaterElectricWorker().work();
        new Bricklayer().work();

        //  使用门面模式
        DecorationCompany.decorate();
    }
}

如你所见,使用门面模式可以避免在客户端有大量的实现逻辑,客户端可以更简单清晰的使用服务。

使用门面模式要遵循以下特点。

  • 门面设计模式更像是客户端应用程序的助手,它不会对客户端隐藏子系统接口,是否使用门面完全取决于客户端代码;
  • 门面设计模式可以应用于开发的任何时刻,通常是在接口数量增加和系统变得复杂时;
  • 子系统接口不知道门面,它们不应该有任何对门面接口的引用;

门面模式的优缺点

优点

  • 松散耦合: 门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
  • 简单易用: 门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。:门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。

缺点

  • 当增加子系统时可能带来未知风险;
  • 门面不符合开闭原则;

门面模式与代理模式的区别

代理模式侧重于对原对象的访问控制;

代理模式会实现原对象的接口;

代理模式只代理一个接口;

门面模式更侧重于整合子系统资源;

门面模式和子系统对象具有不同的接口抽象;

门面模式代理的是一系列接口。


以上就是门面模式的内容,如果对你有所帮助,点赞是对我最大的鼓励!