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

  • 为复杂的模块或子系统提供外界访问的模块
  • 子系统相对独立
  • 预防低水平人员带来的风险
相关推荐
qq_4419960524 分钟前
Mybatis官方生成器使用示例
java·mybatis
巨大八爪鱼31 分钟前
XP系统下用mod_jk 1.2.40整合apache2.2.16和tomcat 6.0.29,让apache可以同时访问php和jsp页面
java·tomcat·apache·mod_jk
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
计算机-秋大田2 小时前
基于微信小程序的养老院管理系统的设计与实现,LW+源码+讲解
java·spring boot·微信小程序·小程序·vue
魔道不误砍柴功4 小时前
简单叙述 Spring Boot 启动过程
java·数据库·spring boot
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
wclass-zhengge4 小时前
SpringCloud篇(配置中心 - Nacos)
java·spring·spring cloud
路在脚下@4 小时前
Springboot 的Servlet Web 应用、响应式 Web 应用(Reactive)以及非 Web 应用(None)的特点和适用场景
java·spring boot·servlet
黑马师兄4 小时前
SpringBoot
java·spring