设计模式之“外观模式(门面模式)(Facade)”

一.外观模式

1.概念

  • 为子系统中的一组接口提供一个一致的界面
  • 此模式定义了一个高层接口
  • 这个接口使得这一子系统更加容易使用
  • 他完美的体现了依赖倒转原则和迪米特法则的思想,是常用模式之一

2.何时使用

  • 首先在设计初期阶段,应该要有意识的将不同的两个层分离(如:经典的三层架构)

    • 经典的三层架构
      • 就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与逻辑层之间建立外观模式(Facade)

      • 这样可以为复杂的子系统提供一个简单的接口,使得耦合性大大降低
  • 其次,在开发阶段,子系统往往因为不断的重构演化而变得原来越复杂

    • 大多数的模式使用时也都会残生很多很小的类
    • 会给外部调用他们的用户程序带来了使用上的困难
    • 增加外观Facade类,可以提供一个简单的接口,减少他们之间的依赖

  • 再则,维护一个遗留的大型系统时,可能这个系统已经非常难维护和扩展了

    • 因为它包含非常重要的功能,新的需求开发必须要依赖于它。
    • 此时用外观模式Facade也非常适合
    • 你可以为新系统开发一个外观Facade类

    • 来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口

    • 让新系统与Facade对象交互,Facade与遗留代码交换所有复杂的工作

 

 

二.结构图

 

三.案例

1.测试类

package com.facadePatterns.facade;

/**
 * 测试外观模板
 *
 * @author 王子威
 * @date 2022/9/15
 */
public class TestFacade
{
    public static void main(String[] args)
    {
        // 生成外观类
        Facade facade = new Facade();
        // 外观模板A
        facade.mathodA();
    }
}

 

2.外观类

package com.facadePatterns.facade;

/**
 * 外观类【外观模板】
 *
 * @author 王子威
 * @date 2022/9/15
 */
public class Facade
{
    SubSystemOne subSystemOne;
    SubSystemTwo subSystemTwo;
    SubSystemThree subSystemThree;
    SubSystemFour subSystemFour;

    /**
     * 初始化各个子系统类
     */
    public Facade()
    {
        this.subSystemOne = new SubSystemOne();
        this.subSystemTwo = new SubSystemTwo();
        this.subSystemThree = new SubSystemThree();
        this.subSystemFour = new SubSystemFour();
    }

    /**
     * 外观模板A
     */
    public void mathodA()
    {
        subSystemOne.methodOne();
        subSystemTwo.methodTwo();
        subSystemThree.methodThree();
        subSystemFour.methodFour();
    }
}

 

3.子系统一

package com.facadePatterns.facade;

/**
 * 子系统类一
 *
 * @author 王子威
 * @date 2022/9/15
 */
public class SubSystemOne
{
    public void methodOne()
    {
        System.out.println("子系统类一方法一");
    }
}

 

4.子系统二

package com.facadePatterns.facade;

/**
 * 子系统类二
 *
 * @author 王子威
 * @date 2022/9/15
 */
public class SubSystemTwo
{
    public void methodTwo()
    {
        System.out.println("子系统类二方法二");
    }
}

 

5.子系统三

package com.facadePatterns.facade;

/**
 * 子系统类三
 *
 * @author 王子威
 * @date 2022/9/15
 */
public class SubSystemThree
{
    public void methodThree()
    {
        System.out.println("子系统类三方法三");
    }
}

 

6.子系统四

package com.facadePatterns.facade;

/**
 * 子系统类四
 *
 * @author 王子威
 * @date 2022/9/15
 */
public class SubSystemFour
{
    public void methodFour()
    {
        System.out.println("子系统类四方法四");
    }
}

 

7.结果图

 

posted @ 2022-09-15 17:49  骚哥  阅读(145)  评论(0编辑  收藏  举报