Java特性之设计模式【外观模式】

一、外观模式

概述

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用

主要解决

降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口

何时使用

1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可

2、定义系统的入口

优缺点

优点:

  • 减少系统相互依赖
  • 提高灵活性
  • 提高了安全性

缺点:

  • 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适

1. 各个角色介绍

1.1 外观(Facade)

  • 提供一个简化的接口,封装了系统的复杂性。外观模式的客户端通过与外观对象交互,而无需直接与系统的各个组件打交道

1.2 子系统(Subsystem)

  • 由多个相互关联的类组成,负责系统的具体功能。外观对象通过调用这些子系统来完成客户端的请求

1.3 客户端(Client)

  • 使用外观对象来与系统交互,而不需要了解系统内部的具体实现

2. UML图

​ 我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。下一步是定义一个外观类 ShapeMakerShapeMaker 类使用实体类来代表用户对这些类的调用。Main 类使用 ShapeMaker 类来显示结果

3. 具体例子和代码

角色分配

  • Shape:形状接口

    • Rectangle:实现形状接口的长方形类
    • Circle:实现形状接口的圆形类
    • Square:实现形状接口的正方形
  • ShapeMaker:外观类

3.1 抽象组件及其实现类

  • Shape
java 复制代码
package com.vinjcent.prototype.decorator;

/**
 * @author vinjcent
 * @description 形状接口
 * @since 2024/3/15 16:23
 */
public interface Shape {

    /**
     * 形状绘制动作
     */
    void draw();

}
  • Rectangle
java 复制代码
package com.vinjcent.prototype.facade;

/**
 * @author vinjcent
 * @description 长方形
 * @since 2024/3/20 16:32
 */
public class Rectangle implements Shape {

    @Override
    public void draw() {
        System.out.println("Rectangle::draw()");
    }

}
  • Circle
java 复制代码
package com.vinjcent.prototype.facade;

/**
 * @author vinjcent
 * @description 圆形
 * @since 2024/3/20 16:36
 */
public class Circle implements Shape {

    @Override
    public void draw() {
        System.out.println("Circle::draw()");
    }

}
  • Square
java 复制代码
package com.vinjcent.prototype.facade;

/**
 * @author vinjcent
 * @description 正方形
 * @since 2024/3/20 16:34
 */
public class Square implements Shape {

    @Override
    public void draw() {
        System.out.println("Square::draw()");
    }

}

3.2 外观类

  • ShapeMaker
java 复制代码
package com.vinjcent.prototype.facade;

import io.swagger.annotations.ApiModelProperty;

/**
 * @author vinjcent
 * @description 外观类
 * @since 2024/3/20 16:35
 */
public class ShapeMaker {

    @ApiModelProperty("圆形")
    private final Shape circle;

    @ApiModelProperty("长方形")
    private final Shape rectangle;

    @ApiModelProperty("正方形")
    private final Shape square;

    public ShapeMaker() {
        circle = new Circle();
        rectangle = new Rectangle();
        square = new Square();
    }

    public void drawCircle() {
        circle.draw();
    }

    public void drawRectangle() {
        rectangle.draw();
    }

    public void drawSquare() {
        square.draw();
    }

}

3.3 测试主函数

java 复制代码
package com.vinjcent.prototype.facade;

/**
 * @author vinjcent
 * @description 外观模式
 * @since 2024/3/20 16:38
 */
public class Main {

    public static void main(String[] args) {

        // 创建一个"外观类"
        ShapeMaker shapeMaker = new ShapeMaker();

        // 绘制"圆形"
        shapeMaker.drawCircle();

        // 绘制"长方形"
        shapeMaker.drawRectangle();

        // 绘制"正方形"
        shapeMaker.drawSquare();
    }

}
  • 测试结果

4. 使用场景

  • 为复杂的模块或子系统提供外界访问的模块
  • 子系统相对独立
  • 预防低水平人员带来的风险
相关推荐
逆境不可逃24 分钟前
一篇速通互联网架构的不断升级过程:从单机到云原生
java·elasticsearch·搜索引擎·云原生·架构
scott.cgi3 小时前
Unity直接编译Java文件作为插件,导致失败的两个打包设置
java·unity·unity调用java·unity的java文件·unity的android插件·unity调用android·unity加载java代码
澈2076 小时前
C++并查集:高效解决连通性问题
java·c++·算法
2401_873479408 小时前
运营活动被薅羊毛怎么防?用IP查询+设备指纹联动封堵漏洞
java·网络·tcp/ip·github
ShiJiuD6668889998 小时前
大事件板块一
java
摇滚侠8 小时前
@Autowired 和 @Resource 的区别
java·开发语言
SeaTunnel8 小时前
(八)收官篇 | 数据平台最后一公里:数据集成开发设计与上线治理实战
java·大数据·开发语言·白鲸开源
吴声子夜歌9 小时前
Java——线程的基本协作机制
java·线程协作
谙弆悕博士10 小时前
【附C++源码】从零开始实现 2048 游戏
java·c++·游戏·源码·项目实战·2048
多加点辣也没关系10 小时前
设计模式-观察者模式
观察者模式·设计模式