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. 使用场景

  • 为复杂的模块或子系统提供外界访问的模块
  • 子系统相对独立
  • 预防低水平人员带来的风险
相关推荐
人生在勤,不索何获-白大侠17 分钟前
day17——Java集合进阶(Collections、Map)
java·开发语言
程序员小羊!29 分钟前
Java教程:JavaWeb ---MySQL高级
java·开发语言·mysql
白仑色36 分钟前
Spring Boot 多环境配置详解
java·spring boot·后端·微服务架构·配置管理
超级小忍38 分钟前
在 Spring Boot 中优化长轮询(Long Polling)连接频繁建立销毁问题
java·spring boot·后端
David爱编程42 分钟前
Java 中 Integer 为什么不是万能的 int 替代品?
java·后端
老马啸西风44 分钟前
个人网站一键引入免费开关评论功能 giscus
java
Z_W_H_1 小时前
【springboot】IDEA手动创建SpringBoot简单工程(无插件)
java·spring boot·intellij-idea
HeXDev1 小时前
【SkyWalking】服务端部署与微服务无侵入接入实战指南
java·微服务·架构·skywalking·链路追踪·微服务治理
探索java1 小时前
Java 深入解析:JVM对象创建与内存机制全景图
java·jvm
Sylvia-girl2 小时前
Java---IDEA
java·开发语言·intellij-idea