23种设计模式(8) java外观模式

yizhihongxing

23种设计模式(8) Java外观模式

一、什么是外观模式?

外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供一个一致的接口,使得这个子系统更加容易被使用。

外观模式又称为门面模式,顾名思义,就是像房屋门面一样,将一个复杂的系统或一组类的接口封装起来,提供一个更加简单、易用的接口,使得外部用户通过这个接口就能够完成庞杂的操作。

外观模式的主要作用是简化接口,降低因为复杂度导致的程序难度和学习成本,同时也可以降低依赖性和耦合度。

二、外观模式的角色和实现

外观模式包含以下角色:

  • Facade(门面角色): 外部类,对外提供简单的调用接口,封装系统各个子系统的具体接口和实现;
  • Subsystem(子系统角色): 相对独立的子系统模块,实现子系统具体的功能。

外观模式的实现步骤:

  • 创建子系统类和对应的接口;
  • 创建门面类,对外提供简单的调用接口,并将调用委派给子系统类完成具体操作。

三、代码示例

1. 简单示例

假设我们要实现一个简单的计算器,可以进行加、减、乘和除等操作,我们可以使用外观模式,将不同的操作封装在不同的子系统中。

  1. 首先定义一个计算器接口,包括加、减、乘、除四个方法:
public interface Calculator {
    public void add(double a, double b);
    public void subtract(double a, double b);
    public void multiply(double a, double b);
    public void divide(double a, double b);
}
  1. 然后实现具体的子系统类,如加减乘除子系统:
public class AddSystem implements Calculator {
    public void add(double a, double b) {
        System.out.println(a + " + " + b + " = " + (a + b));
    }
    //...其他方法省略
}
public class SubSystem implements Calculator {
    public void subtract(double a, double b) {
        System.out.println(a + " - " + b + " = " + (a - b));
    }
    //...其他方法省略
}
public class MultiplySystem implements Calculator {
    public void multiply(double a, double b) {
        System.out.println(a + " * " + b + " = " + (a * b));
    }
    //...其他方法省略
}
public class DivideSystem implements Calculator {
    public void divide(double a, double b) {
        System.out.println(a + " / " + b + " = " + (a / b));
    }
    //...其他方法省略
}
  1. 最后定义一个门面类,将具体的计算操作封装起来,对外提供简单的接口:
public class CalculatorFacade {
    private AddSystem adder;
    private SubSystem subtractor;
    private MultiplySystem multiplier;
    private DivideSystem divider;

    public CalculatorFacade() {
        this.adder = new AddSystem();
        this.subtractor = new SubSystem();
        this.multiplier = new MultiplySystem();
        this.divider = new DivideSystem();
    }

    public void add(double a, double b) {
        adder.add(a, b);
    }
    public void subtract(double a, double b) {
        subtractor.subtract(a, b);
    }
    public void multiply(double a, double b) {
        multiplier.multiply(a, b);
    }
    public void divide(double a, double b) {
        divider.divide(a, b);
    }
}

这样,我们就可以通过门面类来进行计算,避免直接操作子系统类造成的繁琐代码。

2. 网络图片下载示例

假设我们要实现一个网络图片下载的程序,可以下载不同尺寸的图片,并同时获取图片的大小和类型,我们可以使用外观模式封装下载、获取大小和获取类型等复杂的操作。

  1. 首先定义三个子系统类,分别用来下载图片、获取图片大小和获取图片类型:
public class ImageDownloader {
    public void download(String url) {
        //下载图片的具体实现
    }
}

public class ImageSizeFetcher {
    public int getSize(String url) {
        //获取图片大小的具体实现
    }
}

public class ImageTypeDetector {
    public String getType(String url) {
        //获取图片类型的具体实现
    }
}
  1. 然后定义一个门面类,对外提供下载、获取大小和获取类型等操作:
public class ImageFacade {
    private ImageDownloader downloader;
    private ImageSizeFetcher fetcher;
    private ImageTypeDetector detector;

    public ImageFacade() {
        downloader = new ImageDownloader();
        fetcher = new ImageSizeFetcher();
        detector = new ImageTypeDetector();
    }

    public void download(String url) {
        downloader.download(url);
    }
    public int getSize(String url) {
        return fetcher.getSize(url);
    }
    public String getType(String url) {
        return detector.getType(url);
    }
}

这样,我们就可以通过门面类来进行图片下载、大小计算和类型获取等操作,简化了操作流程并提高了代码可读性。

四、适用场景

当我们需要使用某个系统的接口,又不想暴露系统的复杂内部实现时,可以使用外观模式。

外观模式适用于以下情况:

  • 当要为一个复杂子系统对外提供一个简单接口时;
  • 当客户程序与抽象类的实现部分之间存在着很大的依赖性;
  • 当需要将一个复杂的系统分割成多个子系统时,使用外观模式可以将子系统之间的耦合降到最小。

五、总结

外观模式是一种用来简化接口的设计模式,通过将复杂的内部实现封装起来,提供简单、易用的接口,从而降低系统和子系统之间的耦合度和依赖性。

在程序设计中,外观模式可以帮助我们把复杂的系统设计分成多个模块,使程序结构更加清晰、易于维护。因此,外观模式在实际开发中具有重要的应用价值。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:23种设计模式(8) java外观模式 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • java构造方法的作用总结

    下面为您详细讲解“java构造方法的作用总结”的完整攻略。 什么是java构造方法 Java中的构造方法是一种特殊类型的方法,它允许我们在创建对象时执行代码来初始化对象。构造方法通常与类的名称相同,不包含返回类型,并且可以有参数。 java构造方法的作用 初始化实例变量 构造方法用于初始化一个对象的实例变量,它可以完成对象的初始化工作。在Java当中,对象的…

    Java 2023年5月26日
    00
  • Farpoint的简单用法简要概述

    Farpoint的简单用法简要概述 Farpoint是一款由美国开发商研发的企业级Excel组件,旨在增强Excel的导入导出、处理、编辑等功能,提高研发、业务等效率。Farpoint可以集成在.NET版本的Visual Studio中,使用也较为简单。本篇攻略将详细讲解Farpoint的简单用法,帮助开发者更好地使用该组件。 1. Farpoint的安装与…

    Java 2023年6月16日
    00
  • jsp Hibernate入门教程第1/3页

    我可以给你详细讲解一下“jsp Hibernate入门教程第1/3页”的完整攻略。 1. 环境准备 首先,你需要安装 Java 开发环境和 Tomcat 服务器。然后,你需要在 Eclipse 或者其他 IDE 中创建一个 Dynamic Web Project,并将 Tomcat 服务器添加到项目中。 接着,你需要下载 Hibernate 框架的 jar …

    Java 2023年5月20日
    00
  • JDBC的扩展知识点总结

    下面我会详细讲解“JDBC的扩展知识点总结”的完整攻略。 JDBC的扩展知识点总结 什么是JDBC Java数据库连接(Java Database Connectivity,简称JDBC)是Java语言中用于执行SQL语句的一组API。通俗地讲,JDBC就是Java语言连接数据库的一个标准规范。使用JDBC,可以使Java程序与任何支持SQL的关系型数据库进…

    Java 2023年5月20日
    00
  • javaweb在线支付功能实现代码

    下面是“javaweb在线支付功能实现代码”的完整攻略。 确定支付方式和接口 首先需要确定网站支持哪些支付方式,例如支付宝、微信支付等,然后根据支付方式找到相应的支付接口,例如支付宝的即时到账接口或者微信支付的统一下单接口。 创建订单 在用户确认需要支付时,需要创建对应的订单并保存到数据库中。订单包含以下信息: 订单号:唯一标识该订单 商品名称:用户购买的商…

    Java 2023年6月15日
    00
  • SpringBoot集成kafka全面实战记录

    下面我将为大家详细讲解SpringBoot集成Kafka全面实战记录的完整攻略。 1. 环境搭建 在开始之前,我们需要先完成环境搭建,包括安装JDK、安装Kafka、创建Kafka集群等操作。具体的步骤可以参考Kafka官方文档,这里不再赘述。 2. SpringBoot集成Kafka 2.1 引入依赖 首先,在SpringBoot项目中引入Kafka相关的…

    Java 2023年5月20日
    00
  • Java字符编码解码的实现详解

    Java字符编码解码的实现详解 在Java编程中,字符编码解码是非常重要的一环。本文将详细介绍Java字符编码解码的过程以及常见的实现方式。 字符编码和解码的基本概念 字符编码:将一个字符转化为二进制数据的过程。 字符解码:将二进制数据转化为字符的过程。 在Java中,字符编码和解码都是通过Java标准库中的charset类来实现的。 Java字符编码和解码…

    Java 2023年5月19日
    00
  • Eclipse环境下如何配置Tomcat(把项目部署到Tomcat服务器上)

    下面是Eclipse环境下如何配置Tomcat的完整攻略,包括把项目部署到Tomcat服务器上的过程。 配置Eclipse环境 下载安装Eclipse 首先需要下载安装Eclipse IDE,可以去官网下载最新版Eclipse并进行安装。 下载安装Tomcat 进入Tomcat官网下载最新版本的Tomcat,并进行安装。 在Eclipse中安装插件 打开Ec…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部