外观(门面)模式

思考外观模式

正常完成一个功能需要调很多个接口,外观模式就是组装这些接口为一个接口,对外提供这一个接口,用户调用这一个接口就能完成原来多个接口才能完成的功能,让客户端与子系统之间实现了解耦,简化调用

1.外观模式的本质

外观模式的本质是:封装交互,简化调用。

门面模式的本质是提供一个统一的接口,封装一组复杂的子系统或组件,使其对客户端呈现出一个简单的界面。它通过引入一个门面类(Facade Class)作为客户端与子系统之间的中间层,将客户端的请求委派给相应的子系统进行处理。

门面模式的本质是通过封装复杂性,隐藏系统的内部复杂结构和实现细节,提供一个简单易用的接口给客户端。它在设计上追求简单性和易用性,使得客户端能够更加方便地使用系统的功能,同时实现了客户端与子系统之间的松耦合关系。

门面模式的关键是门面类,它充当了一个入口点的角色。门面类封装了一系列子系统的功能,负责协调子系统的交互,并提供一个高层次的接口给客户端使用。客户端只需与门面类进行交互,而无需直接与子系统进行交互,从而降低了客户端的复杂性。

通过使用门面模式,可以实现系统的简化、松耦合、封装复杂性和支持分层架构等优点。它是一种结构型设计模式,常用于大型系统或复杂的软件系统中,以提供更好的可维护性、可扩展性和易用性。

2.何时选用外观模式

建议在如下情况时选用外观模式。

  • 当需要为复杂的子系统提供一个简单易用的接口,以方便客户端进行操作时,门面模式非常有用。门面类可以封装一系列复杂的操作,将其转化为简单的接口方法,使得客户端能够更加方便地使用子系统的功能。

  • 当需要构建分层架构的系统时,门面模式可以用于定义每个层级的接口。每个层级可以有一个门面类,用于与上一层级进行交互,并隐藏下一层级的细节。这样可以有效地划分系统的职责,提高系统的可维护性和可扩展性。

总而言之,门面模式适用于需要简化复杂系统、实现松耦合、提供简单接口或支持分层架构的情况。它可以将复杂性封装起来,提供一个简单统一的接口,使得系统更易用、更灵活。

3.优缺点

外观模式有如下优点

  • 提供简单接口
    当需要为复杂的子系统提供一个简单易用的接口,以方便客户端进行操作时,门面模式非常有用。门面类可以封装一系列复杂的操作,将其转化为简单的接口方法,使得客户端能够更加方便地使用子系统的功能。

  • 支持分层架构
    当需要构建分层架构的系统时,门面模式可以用于定义每个层级的接口。每个层级可以有一个门面类,用于与上一层级进行交互,并隐藏下一层级的细节。这样可以有效地划分系统的职责,提高系统的可维护性和可扩展性。

外观模式有如下缺点

  • 增加了一个额外的抽象层
    引入门面类会增加系统的复杂性,因为需要额外的抽象层来封装子系统的功能。这可能会导致一定的性能损失,特别是在对性能要求较高的系统中。

  • 不适合过于简单的系统
    如果系统本身非常简单,并且不存在复杂的子系统或组件,使用门面模式可能会引入不必要的复杂性。在这种情况下,直接与系统进行交互可能更加简单和高效。

4.外观模式的结构

在这里插入图片描述

5.实现

模拟代码生成使用的外观模式
在这里插入图片描述

public class ControllerGenerate {

    public void generate(){
        System.out.println("controller层代码生成");
    }
}

public class ServiceGenerate {

    public void generate(){
        System.out.println("service层代码生成");
    }
}

public class DaoGenerate {

    public void generate(){
        System.out.println("dao层代码生成");
    }
}

门面类

public class Facade {

	//组装各个方法
    public static void generate(){
        ControllerGenerate controllerGenerate = new ControllerGenerate();
        ServiceGenerate serviceGenerate = new ServiceGenerate();
        DaoGenerate daoGenerate = new DaoGenerate();
        controllerGenerate.generate();
        serviceGenerate.generate();
        daoGenerate.generate();
    }
}

测试

public class FacadeTest {

    /**
     * 模拟代码生成过程
     * 1.生成controller层
     * 2.生成service层
     * 3.生成dao层
     * @param args
     */
    public static void main(String[] args) {
        ControllerGenerate controllerGenerate = new ControllerGenerate();
        ServiceGenerate serviceGenerate = new ServiceGenerate();
        DaoGenerate daoGenerate = new DaoGenerate();
        controllerGenerate.generate();
        serviceGenerate.generate();
        daoGenerate.generate();

        System.out.println("--------------------------------");

        Facade.generate();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值