设计模式-外观模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397)

目录

定义

特点

使用场景

优缺点

[(1) 优点](#(1) 优点)

[(2) 缺点](#(2) 缺点)

模式结构

具体实现

实际应用

定义

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

特点

向现有的系统添加一个接口,来隐藏系统的复杂性。

使用场景

    • 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
    • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
    • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

优缺点

(1) 优点
    • 减少系统相互依赖。
    • 提高灵活性。
    • 提高了安全性。
(2) 缺点
    • 不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

模式结构

外观(Facade)模式包含以下主要角色。

    • 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
    • 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
    • 客户(Client)角色:通过一个外观角色访问各个子系统的功能。

具体实现

抽象类和具体实现类

复制代码
/**
 * 形状接口
 */
public interface Shape {

    /**
     * 绘制
     */
    void draw();
}

/**
 * 圆形
 */
public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("draw circle begin...");
    }
}

/**
 * 矩形
 */
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("draw rectangle begin...");
    }
}

外观类

复制代码
/**
 * 外观类
 */
public class ShapeMaker {
    private Shape circle;
    private Shape rectangle;

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

    /**
     * 绘制圆形
     */
    public void drawCircle() {
        circle.draw();
    }

    /**
     * 绘制矩形
     */
    public void drawRectangle() {
        rectangle.draw();
    }

    /**
     * 绘制所有形状
     */
    public void drawAll() {
        drawCircle();
        drawRectangle();
    }
}

具体使用

复制代码
public class App {
    public static void main(String[] args) {
        ShapeMaker shapeMaker = new ShapeMaker();

        shapeMaker.drawCircle();
        shapeMaker.drawRectangle();

        shapeMaker.drawAll();
    }
}

实际应用

1、常用功能、SDK封装

2、常用框架等接口的暴露。

相关推荐
一 乐14 小时前
高校教务|教务管理|基于springboot+vue的高校教务管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·教务管理
数字冰雹14 小时前
重塑城市公共安全管理的“智慧之眼”
java·大数据·数据库
August_._14 小时前
【MySQL】触发器、日志、锁机制 深度解析
java·大数据·数据库·人工智能·后端·mysql·青少年编程
Halo_tjn14 小时前
基于 Object 类及包装类的专项实验
java·开发语言·计算机
百锦再14 小时前
第10章 错误处理
java·git·ai·rust·go·错误·pathon
拾忆,想起14 小时前
超时重传 vs 快速重传:TCP双保险如何拯救网络丢包?
java·开发语言·网络·数据库·网络协议·tcp/ip·php
從南走到北14 小时前
JAVA国际版同城外卖跑腿团购到店跑腿多合一APP系统源码支持Android+IOS+H5
android·java·ios·微信小程序·小程序
budingxiaomoli14 小时前
多线程(一)
java·开发语言·jvm·java-ee
m0_7482480215 小时前
C++中的位运算符:与、或、异或详解
java·c++·算法
介一安全15 小时前
从 0 到 1 玩转 2025 最新 WebGoat 靶场:环境搭建 + 全关卡漏洞解析(超级详细)
java·web安全·网络安全·靶场