• 23种设计模式(10)——门面模式


    门面模式(Facade Pattern)又叫作外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式。

    其实,在日常编码工作中,我们都在有意无意地大量使用门面模式。但凡只要高层模块需要调度多个子系统(2个以上类对象),我们都会自觉地创建一个新类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。

    来个简单的demo:

    我u有以下三个service:

    1. public class ServiceA {
    2. public void doA(){
    3. System.out.println("do ServiceA");
    4. }
    5. }
    6. public class ServiceB {
    7. public void doB(){
    8. System.out.println("do ServiceB");
    9. }
    10. }
    11. public class ServiceC {
    12. public void doC(){
    13. System.out.println("do ServiceC");
    14. }
    15. }

    在没有引入门面模式的时候,我们是这么调用的:

    1. public class Client {
    2. public static void main(String[] args) {
    3. ServiceA serviceA = new ServiceA();
    4. ServiceB serviceB = new ServiceB();
    5. ServiceC serviceC = new ServiceC();
    6. serviceA.doA();
    7. serviceB.doB();
    8. serviceC.doC();
    9. }
    10. }

    没啥毛病啊,结合到spingmvc开发,这些service交给spring管理,根本不用自己new了,直接注入到controller就可以,但是如果10个地方都用了这三个service呢?这10个controller里都注入一下?这时候考虑优化——我可以新建一个service,持有这个三个service不就ok了吗:

    1. public class ServiceFacade {
    2. //是不是很像我们controller里注入各种service?
    3. private ServiceA serviceA = new ServiceA();
    4. private ServiceB serviceB = new ServiceB();
    5. private ServiceC serviceC = new ServiceC();
    6. public void doA() {
    7. serviceA.doA();
    8. }
    9. public void doB() {
    10. serviceB.doB();
    11. }
    12. public void doC() {
    13. serviceC.doC();
    14. }
    15. }

    客户端就变成了

    1. public class Client {
    2. public static void main(String[] args) {
    3. //轻轻松松的搞定,只需要创建门面这个对象即可
    4. ServiceFacade serviceFacade= new ServiceFacade ();
    5. serviceFacade.doA();
    6. serviceFacade.doB();
    7. serviceFacade.doC();
    8. }
    9. }

    门面模式中的角色

    由上图可以看到,门面模式主要包含2个角色。

    • 外观角色(Facade):也叫作门面角色,是系统对外的统一接口。
    • 子系统角色(Service):可以同时有一个或多个Service。每个Service都不是一个单独的类,而是一个类的集合。Service们并不知道Facade的存在,对于Service们而言,Facade 只是另一个客户端而已(即Facade对ServiceA、ServiceB、ServiceC透明)。

    门面模式的扩展

    优点

    ● 减少系统的相互依赖   想想看,如果我们不使用门面模式,外界访问直接深入到子系统内部,相互之间是一种强耦合关系,你死我就死,你活我才能活,这样的强依赖是系统设计所不能接受的,门面模式的出现就很好地解决了该问题,所有的依赖都是对门面对象的依赖,与子系统无关。

    ● 提高了灵活性   依赖减少了,灵活性自然提高了。不管子系统内部如何变化,只要不影响到门面对象,任你自由活动。

    ● 提高安全性   想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问到 。

    缺点

    当增加子系统和扩展子系统行为时,可能容易带来未知风险。

    不符合开闭原则。

    某些情况下,可能违背单一职责原则。

  • 相关阅读:
    LeetCode 704. 二分查找
    多线程访问资源计数不正确问题分析
    STC51单片机学习笔记10——AD测试(stc15w408as)
    企业打造智能工厂的核心系统——【MES系统】
    如何查看网络下发的能力中是否支持ims
    基于JSP的二手车交易网站
    盒子模型的基础
    Spring神器:Environment环境配置
    【Spring】Ioc容器
    R语言矩阵数据初始化:创建全为0的矩阵、全为NA的矩阵、使用byrow参数指定数据排布方式(按行、按列)、dim参数指定矩阵维度信息
  • 原文地址:https://blog.csdn.net/cj_eryue/article/details/134071420