设计模式(十一)外观模式

2023-10-27

外观模式是另一种结构型设计模式,当我们想要隐藏系统的复杂实现,想客户包含简单的使用接口的时候,就可以使用外观模式。我们需要创建一个外观类,提供要给用户暴露的方法。

外观模式的优点就是用户和系统解耦,系统可以独立于用户修改,缺点就是用户虽然和系统解耦了,但是转而和外观类耦合。所以将来如果需要修改外观类将是一个麻烦的事情。

我们用代码来说明一下外观模式吧。假设有这么一个生产流程:工厂生产产品需要一个请求,请求包含了要生产产品的信息,工厂收到信息之后开始生产。对应的几个类如下。

//请求类
public class Request {
    private String msg;

    public Request(String msg) {
        this.msg = msg;
    }

    public String getMsg() {
        return msg;
    }
}

//产品类
public class Product {
    private String name;

    public Product(String name) {
        this.name = name + "对应的产品";
    }

    public String getName() {
        return name;
    }
}

//工厂类
public class Factory {
    public Product produce(Request request){
        Product product=new Product(request.getMsg());
        return product;
    }
}

如果让用户来管理整个生产流程,无疑是比较复杂的。我们可以建立一个外观类隐藏所有这些细节。

public class FactoryFacade {
    private Factory factory;

    public FactoryFacade() {
        this.factory = new Factory();
    }

    public Product service(String msg) {
        Request request = new Request(msg);
        return factory.produce(request);
    }
}

然后用户只需要简单的使用外观类即可,代码也变得非常简洁。

    public void run() {
        FactoryFacade facade=new FactoryFacade();
        Product product=facade.service("A");
        System.out.println(product.getName());
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式(十一)外观模式 的相关文章

  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 如果使用的 JVM 是 x86 或 x64,则以不同的方式解决 Maven 依赖关系?

    我设置了一个 Maven 存储库来托管一些 dll 但我需要我的 Maven 项目根据使用的 JVM 是 x86 还是 x64 下载不同的 dll 例如 在运行 x86 版本 JVM 的计算机上 我需要从存储库下载 ABC dll 作为依赖
  • 如何从 Retrofit2 获取字符串响应?

    我正在做 android 正在寻找一种方法来执行超级基本的 http GET POST 请求 我不断收到错误 java lang IllegalArgumentException Unable to create converter for
  • 如何将 android.net.Uri 转换为 java.net.URL? [复制]

    这个问题在这里已经有答案了 有没有办法从Uri to URL 我正在使用的库需要这个 它only接受一个URL但我需要在我的设备上使用图像 如果该方案的Uri is http or https new URL uri toString 应该
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett
  • 启动Java项目时发生类冲突:ClassMetadataReadingVisitor将接口org.springframework.asm.ClassVisitor作为超类

    我正在使用最新的Spring框架版本 3 2 2 RELEASE 开发一个Java Web项目 但是现在项目启动时遇到了问题 详细错误是 java lang IncompleteClassChangeError 类 org springfr

随机推荐

  • vbs整人小病毒2

    海螺 大家好 这是我第二次发文章 点个赞再走吧 Thanks 还有关注 好 直接上代码 Dim AutoRunProgram Set AutoRunProgram WScript CreateObject WScript shell Reg
  • 构建高并发高可用的电商平台架构大纲

    构建高并发高可用的电商平台架构大纲 参考 http blog csdn net yangbutao article details 12242441
  • 人工智能的常用十种算法

    1 决策树 根据一些 feature 进行分类 每个节点提一个问题 通过判断 将数据分为两类 再继续提问 这些问题是根据已有数据学习出来的 再投入新数据的时候 就可以根据这棵树上的问题 将数据划分到合适的叶子上 2 随机森林 视频 在源数据
  • SpringBoot 整合websocket 测试出错

    问题描述 javax websocket server ServerContainer not available 问题起因 一般情况下 使用 SpringBootTest后 Spring将加载所有被管理的bean 基本等同于启动了整个服务
  • 实现Callable接口

  • 【HarmonyOS】【DevEco Studio】ohpm安装失败该如何解决?

    关键词 HarmonyOS DevEco Studio ohpm安装失败 问题背景及解决方案 最近遇到很多DevEco Studio安装ohpm失败的问题 下面给大家介绍几种出现的问题以及解决方案 1 ohpm not set up 报错截
  • 测试用例--测试大纲(提纲)法

    测试大纲 提纲 法 一 应用场合 程序包含多个窗口 每个窗口有多个操作 这些操作之间有一定的关系 为了弄清楚窗口之间不同操作的联系 可以使用测试大纲法 常用于测1 软件的安装 删除程序2 界面之间的跳转关系等 二 测试大纲法的测试步骤 步骤
  • pread,pwrite,read,write区别

    pread pwrite include
  • tc命令——Linux基于IP进行流量限速

    https blog csdn net zhongbeida xue article details 54613750
  • NumPy学习笔记

    NumPy author 段浩 Created on Thu Nov 10 10 21 20 2022 Numpy的介绍 在数据分析和科学计算的领域 Numpy占据十分重要的地位 Numpy使得python具备了操作多维数组的功能 并且效率
  • GET和POST有什么区别?

    简要概括 1 GET提交的数据会放在URL之后 以 分割URL和传输数据 参数之间以 相连 参数值通常以 号赋值 而POST方法是把提交的数据放在HTTP包的Body中 2 GET提交的数据大小有限制 最多只能有1024字节 因为浏览器对U
  • objc.h

    文章目录 objc h 头文件阅读 Class objc object SEL IMP 一些函数定义 方法总结 objc h 头文件阅读 Class Class在Runtime中的定义 An opaque type that represe
  • java程序中的long_java中Long和long的区别

    之前做项目的时候多少接触了这个问题 只是一直没用到这个类型 写的项目都是一些很小的 数据量很少 今天给项目大框架的时候发现 数据库 Oracle 里面Number类型的长度为10以下的时候 如果使用myEclipse自动生成实体类的 这时候
  • CUDA Samples: ripple

    以下CUDA sample是分别用C 和CUDA实现的生成的波纹图像 并对其中使用到的CUDA函数进行了解说 code参考了 GPU高性能编程CUDA实战 一书的第五章 各个文件内容如下 funset cpp include funset
  • 液晶大小

    1 3 5寸液晶 像素点阵 320 240null 2 4 3寸 像素点阵 480 272null
  • 浅谈Spring框架中的IOC(控制反转)和DI(依赖注入)

    浅谈Spring框架中的IOC 控制反转 和DI 依赖注入 控制反转和依赖注入文字表述 1 什么是控制反转 在使用Spring框架之后 对象的实例不再由调用者来创建 而是由Spring容器来创建 Spring容器会控制程序之间的关系 而不是
  • Flink Table API读取Kafka数据,并将结果sink到Kafka中

    最近在小破站上学Flink 跟着做 Flink Table API读取Kafka数据 并将结果sink到Kafka中 这样一个小练习 感觉平平无奇 但是一直运行报错 内心一阵抓狂 WTF 废话少叙 切入正题 使用的是 Flink 1 13
  • 31~50

    Less 31 双引号闭合 直接查询就可 Less 32 在这一关中 单双引号 反斜杠都在addslashes 函数的作用下转义了 所以他们前面都会加上反斜杠 但是我们可以用加上 df的方法来进行注入 查询数据 id 0 df union
  • 基于keras的猫狗分类(小型卷积神经网络)

    背景 本文主要介绍猫狗分类问题 原型取自2013年的kaggle计算机竞赛 你可以从https www kaggle com c dogs vs cats data获取必要的数据集 或者寻找其他的镜像文件 数据集包含25000张猫狗图像 这
  • 设计模式(十一)外观模式

    外观模式是另一种结构型设计模式 当我们想要隐藏系统的复杂实现 想客户包含简单的使用接口的时候 就可以使用外观模式 我们需要创建一个外观类 提供要给用户暴露的方法 外观模式的优点就是用户和系统解耦 系统可以独立于用户修改 缺点就是用户虽然和系