首页 > 编程语言 >Java设计模式-外观模式

Java设计模式-外观模式

时间:2023-05-18 19:23:14浏览次数:35  
标签:外观 Java 系统 接口 模式 设计模式 客户端

简介

在软件开发过程中,经常会遇到复杂的系统和庞大的类库。这些系统往往包含了大量的类和子系统,给开发人员带来了挑战。为了简化接口设计和提高系统的可用性,设计模式提供了一种名为外观模式的解决方案。

外观模式是一种结构型设计模式,旨在为复杂系统提供一个简化的接口。该模式通过隐藏底层系统的复杂性,提供一个更简单、更易于使用的接口给客户端。外观模式是一种封装模式,通过封装底层子系统的复杂性,将其对客户端的可见性降低,从而降低了系统的耦合性。

与其他设计模式的区别: 外观模式与其他设计模式有一些区别。下面是外观模式与一些常见设计模式的对比:

  1. 外观模式 vs. 适配器模式: 适配器模式旨在解决接口不兼容的问题,它将一个类的接口转换成客户端所期望的接口。而外观模式是为了简化复杂系统的接口设计,提供一个更高层次的接口给客户端。
  2. 外观模式 vs. 单例模式: 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。外观模式是一种结构型设计模式,用于简化接口。这两种模式在目的和实现上有所不同。
  3. 外观模式 vs. 组合模式: 组合模式旨在以树形结构组织对象,形成部分-整体的层次结构。外观模式主要用于简化接口,将复杂系统隐藏在一个统一的接口后面。

实现

下面是使用Java编程语言实现外观模式的示例代码:

// 子系统接口
interface SubsystemA {
    void operationA();
}

interface SubsystemB {
    void operationB();
}

// 子系统实现
class ConcreteSubsystemA implements SubsystemA {
    public void operationA() {
        System.out.println("SubsystemA operation");
    }
}

class ConcreteSubsystemB implements SubsystemB {
    public void operationB() {
        System.out.println("SubsystemB operation");
    }
}

// 外观类
class Facade

 {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;

    public Facade() {
        subsystemA = new ConcreteSubsystemA();
        subsystemB = new ConcreteSubsystemB();
    }

    public void operation() {
        subsystemA.operationA();
        subsystemB.operationB();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.operation();
    }
}

优缺点

优点

  1. 简化接口:外观模式为复杂系统提供一个简化的接口,使得客户端更容易使用系统。
  2. 降低耦合性:通过将子系统封装在一个外观类中,降低了系统各个组件之间的耦合性。
  3. 提高灵活性:外观模式使得修改系统变得更容易,因为客户端只需要与外观类交互,而不需要了解子系统的细节。

缺点

  1. 可能导致性能问题:如果外观类的设计不合理,可能会导致性能问题,因为外观类可能成为系统的瓶颈。
  2. 不符合开闭原则:当系统中新增或修改功能时,可能需要修改外观类,违反了开闭原则。

运用场景

外观模式适用于以下场景:

  1. 当存在复杂的子系统,并且需要为客户端提供一个简化的接口时。
  2. 当需要将系统的层次结构和依赖关系与客户端代码解耦时。
  3. 当希望隐藏底层系统的实现细节,并提供一个统一的接口给客户端时。

总结

外观模式是一种结构型设计模式,旨在简化复杂系统的接口设计。通过隐藏底层系统的复杂性,外观模式提供了一个统一、简化的接口给客户端,使得客户端更容易使用系统,并降低系统各个组件之间的耦合性。

外观模式的核心思想是将系统的复杂性封装在一个外观类中,客户端只需要与外观类交互,而不需要了解子系统的具体实现细节。这种封装提供了许多优点。首先,它简化了客户端的使用,使得客户端不需要关注底层系统的复杂性,减少了开发人员的工作量和学习成本。其次,外观模式降低了系统的耦合性,因为客户端只与外观类进行交互,而不需要直接与子系统进行通信。这样,系统的变化对客户端的影响较小,提高了系统的灵活性和可维护性。

然而,外观模式也有一些缺点需要考虑。首先,不合理的设计可能导致外观类成为系统的瓶颈,影响系统的性能。因此,在设计外观类时需要注意性能优化。其次,当系统需要新增或修改功能时,可能需要修改外观类,违反了开闭原则。因此,在使用外观模式时需要仔细考虑系统的变化和扩展性。

外观模式适用于存在复杂子系统、需要简化接口、降低耦合性、隐藏系统实现细节的场景。它在许多应用中得到广泛应用,例如大型软件系统、类库、API等。

通过合理地应用外观模式,我们可以简化系统接口设计,提高系统的可用性和灵活性,并降低系统的耦合性。外观模式是一种强大的工具,可以帮助开发人员处理复杂性,提高开发效率,为软件系统的设计和维护提供便利。

标签:外观,Java,系统,接口,模式,设计模式,客户端
From: https://www.cnblogs.com/xstxjs/p/17413067.html

相关文章

  • Javascript 常见的循环方式总结
    本文地址:https://www.cnblogs.com/zichliang/p/17412968.html在Javascript中有很多种循环方式。有多种循环方式可以用来遍历数组、对象、以及执行一些重复性任务但是有很多方式甚至从未用过,所以简单来总结一下JS中的循环for循环for循环是在您希望创建循环时经常使用的工具。......
  • java8新特性,stream流简单使用
    //新建测试类@Data@NoArgsConstructor@AllArgsConstructor@EqualsAndHashCodepublicclassAuthor{//idprivateLongid;//姓名privateStringname;//年龄privateIntegerage;//简介privateStringintro;//作品privateList<Book>......
  • JavaScript全解析——Ajax是什么(上)
    AJAX是AsynchronousJavaScriptAndXML的缩写。它不是一种编程语言。它是一种基于HTML、CSS、JavaScript和XML,让开发更好、更快和更有互动的Web应用的技术。什么是ajax认识前后端交互前后端交互就是前端与后端的一种通讯方式,主要使用的技术栈就是ajax(asyncjavascript......
  • 通过java执行导出命令,导出dup数据文件到指定位置
    /***1.通过java执行导出命令,导出dup数据文件到指定位置*2.清空表数据,为下一次解析准备*/publicvoidexpDupDataByJaveProcess(){booleansuccess=true;//导致是否成功标识,成功修改为falseStringcmdSql="";//导出命令语句......
  • Java实现输出九九乘法表—for循环和递归算法
    Java实现输出99乘法表for循环publicclassninenine{publicstaticvoidmain(String[]args){for(inti=1;i<10;i++){for(intj=1;j<=i;j++){System.out.printf("%d*%d=%d\t",j,i,j*i);}......
  • 35基于java的校园二手交易系统或跳蚤市场设计与实现
    基于java的校园二手交易系统或跳蚤市场设计与实现,可适用于二手交易平台,二手商城,交易商城,大学生交易平台,购物平台,大学生跳蚤平台等等项目概述随着网络技术的发展,在线购物越来越流行。目前,大学生特别是毕业生的闲置物品很多,很多可以重复使用,但不方便携带。目前市场上针对大学生......
  • java内嵌数据库hsqldb
    java内嵌数据库hsqldb介绍:jdk1.8,maven k开发软件:ideaspringboot+mybatis+hsqldb内容:1.项目搭建2.基本操作3.本地数据持久化第一步 新建maven项目导入依赖<dependencies><dependency><groupId>org.hsql......
  • javascript创建数组
    javascript数组:vararray=[]等于创建一个数组array[0]代表给数组的第一个位置上赋值,值为32array[5]代表给数组的第六位置上赋值。值为3在位置0,1,2,5位置上都赋值,维度3,4位置上未赋值,但有一栏占位,所以会导致array.lenth获取数组的长度为6dor(vari=0;<array.lenth;i++){}代表的......
  • 实验三 Java类的继承与派生
    第1关类的继承packagestep1;importjava.util.Scanner;classPerson{/**********Begin**********///自行设计类的实现//姓名privateStringname;//性别privateStringsex;//年龄privateintage;//构造方法publi......
  • java读取excel表格(含有多个sheet)
    publicList<List<List<String>>>uploadExcel(StringfilePath)throwsFileNotFoundException{//两种方式,一种直接上传的文件MultipartFile,一种用本地的文件:FileFilefile2=newFile(filePath);InputStreaminputStream=newFileInputStrea......