为复杂系统提供一个“综合性对外窗口”的方案——外观模式总结

前言

外观模式也叫门面模式,英文是 facade。这是很常见的一种设计模式,它比如 JDK 中的 Socket 接口就应用了外观模式,参考:门面模式的典型应用 Socket 和 Http(post,get)、TCP/IP 协议的关系总结

外观模式也非常简单,它提供了一个统一的对外的高层次接口,用来访问子系统中的一群接口,也是对象的结构型模式,它符合迪米特法则——最少知道原则,类比现实,比如政府的综合性办事大厅,就非常像 facade 模式。

闲言少叙,直接看代码,外观模式的代码非常好写,但是也不好写,简单是因为其没有特殊的组合、继承、或者抽象的地方,按照我个人理解,就是一种集中接口的思维的体现,难在需要结合业务的实际情况。

外观模式的实现

一个网上商城的最简单例子,在网上商城用钱买商品,也可以使用积分兑换商品,有验证系统(比如资格验证,身份验证等),支付系统,物流系统等模块,如果客户端(业务方)每次使用,都要考虑这三个接口,不仅各个子系统的 RD 维护复杂,也给业务方增加了使用负担,那么就适合使用 facade 模式,进行高层次的一个抽象。

代码如下:Goods 代表商品类,Validate 服务,Distribute 配送服务,还有一个 payoff 支付服务,三个子系统由 facade 服务统一规划。

public class Goods {
    private String name;

    public Goods(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
////////////////////////////////////
public class ValidateService {
    public boolean isOk(Goods goods) {
        System.out.println("验证:" + goods.getName() + "是否有资格兑换商品");
        return true;
    }
}
////////////////////////////////////
public class PayoffService {
    public boolean payoff(Goods goods) {
        System.out.println("兑换:" + goods.getName() + " 成功");
        return true;
    }
}
///////////////////////////////////
public class DistributionService {
    public void distribution(Goods goods) {
        System.out.println("生成订单,准备配送: " + goods.getName());
    }
}
//////////////////////////////////
public class FacadeService {
    private ValidateService validateService;
    private PayoffService payoffService;
    private DistributionService distributionServicel;

    public void setValidateService(ValidateService validateService) {
        this.validateService = validateService;
    }

    public void setPayoffService(PayoffService payoffService) {
        this.payoffService = payoffService;
    }

    public void setDistributionServicel(DistributionService distributionServicel) {
        this.distributionServicel = distributionServicel;
    }

    public void pay(Goods goods) {
        if (this.validateService.isOk(goods)) {
            if (this.payoffService.payoff(goods)) {
                this.distributionServicel.distribution(goods);
            }
        }
    }
}

简化了客户端调用

public class Main {
    public static void main(String[] args) {
        FacadeService facadeService = new FacadeService();
        Goods goods = new Goods("哈哈皮鞋");
        facadeService.setDistributionServicel(new DistributionService());
        facadeService.setPayoffService(new PayoffService());
        facadeService.setValidateService(new ValidateService());
        facadeService.pay(goods);
    }
}

效果如下:

外观模式也可以和单例模式搭配

比如上述案例,完全可以把子系统单例化使用,当然实际业务中,可能 Spring 全家桶更多一些,service 类直接全局配成单例的对象。

外观模式的优点

facade 可以让非常复杂的系统,变的简单好用,比如只提供一个对外的统一门面,屏蔽内部系统的复杂API,本质就是让系统的对外接口变少

外观模式和中介者模式的区别

中介者模式是双向的进行管理和约束,外观模式是单向的管理和约束。具体参考:对象关系一对多转换为一对一的方案——中介者模式总结

原文地址:https://www.cnblogs.com/kubixuesheng/p/10354233.html

时间: 2024-10-09 04:19:18

为复杂系统提供一个“综合性对外窗口”的方案——外观模式总结的相关文章

Bootstrap 需要为页面内容和栅格系统包裹一个 .container 容器。我们提供了两个作此用处的类

布局容器 Bootstrap 需要为页面内容和栅格系统包裹一个 .container 容器.我们提供了两个作此用处的类.注意,由于 padding 等属性的原因,这两种容器类不能互相嵌套. .container 类用于固定宽度并支持响应式布局的容器. 复制 <div class="container"> ... </div> .container-fluid 类用于 100% 宽度,占据全部视口(viewport)的容器. 复制 <div class=&q

spring security 一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架

Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中 配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作. Spring Security 的前身是 Acegi S

H3 BPM:为石化企业提供一个不一样的全停大修平台

H3 BPM大型炼化企业装置全停检修管理平台(简称"全停大修")结合国际化的流程管理理念.成熟的系统技术架构.优秀的行业解决方案,为石油化工行业全停大修提供了卓越的信息化管理方案,获得了业界和客户的广泛认同和高度赞誉. 为了更细致.全面地向业界其他客户展示优秀的管理方案,在近日举行的"2016年全国石油化工企业装备.维护与检修高端研讨会"上,H3 BPM携自主研发的全停大修管理平台亮相峰会,详细介绍了最新的维护检修信息化管理理念及实例展示. 石油化工企业的"

关于iPhone/iPad的iOS系统自动弹出认证窗口问题

前言 路由器,认证服务器,手持无线终端.当通过手持无线设备连接到需要认证的WiFi上,会自动弹出窗口,何解?为什么有的时候就不弹出窗口呢?怎么给商家一个合理的解释呢? 验证问题 通过在路由器上抓包来看弹出窗口的时候都发生了什么? 抓包方法如下http://blog.csdn.net/qianguozheng/article/details/32108093 当弹出认证窗口的时候都发生了什么? 当没有弹出认证窗口的时候,没有弹出认证窗口. 原理剖析 https://developer.apple.

C#中,一个cmd命令窗口执行多条dos命令(有修改,加入执行等待)

原文章标题:C# 程序一个cmd命令窗口执行多条dos命令 原文章地址:http://www.cnblogs.com/visibleisfalse/p/3578886.html 以下代码有修改,标出的红色代码,表示执行一条dos命令后,等待执行完成. public void DoDos(string comd1, string comd2, string comd3) { Process p = new Process();//创建进程对象 try { p.StartInfo.FileName

(原)SQL Server 系统提供功能的三个疑惑

本文目录列表: 1.SQL Server系统提供的部分疑惑概述2.系统函数调用时DEFAULT代替可选参数使用不统一3.队列字段列message_enqueue_time记录的是UTC日期时间 4.@@Pack_Received系统函数提示信息有错误 5.总结语6.参考清单列表 正文: 1.SQL Server系统提供的部分疑惑概述   近来工作之余一直在系统地学习和研究SQL Server 数据库引擎这一整块,发现了一些原来没有太注意的东西,感觉SQL Server 光数据库引擎这块就有很多要

Span使用之系统提供的Span基本样式

Span的应用 在Android中,使用TextView显示文本,但往往有一些特殊的文本样式,比如一段文本,中间某几个字颜色不同或者中间某几个字能点击等等,这些样式如果没有不同,就编写一个新的TextView,那么一段文字将使用很多的TextView去显示,那么,有没有可能使用一个TextView显示所有文字,而基于文字定义不同的样式呢.这就是Span的作用. Span使用三部曲 Span是android提供的用于操作文本的样式的相关类.他能够精确地控制一段文本中具体某些文本的样式.基于Span

Win32编程API 基础篇 -- 2.一个简单的窗口 根据英文教程翻译

一个简单的窗口 例子:简单的窗口 有时人们在IRC提问,”我应该怎样制作一个窗口”...嗯,这恐怕不是完全这么简单好回答!其实这并不难一旦你明白你在做什么,但在你得到一个可展示的窗口之前还有一些事情需要我们去做,我们只需要简单地聊聊快速做下笔记,这个问题就能被很简单的回答. 我很喜欢先动手再学习...一下就是一个简单的窗口的程序,我们将会简短的对它进行解释说明. 1 #include <windows.h> 2 3 const char g_szClassName[] = "myWi

iOS系统提供开发环境下命令行编译工具:xcodebuild

iOS系统提供开发环境下命令行编译工具:xcodebuild[3] xcodebuild 在介绍xcodebuild之前,需要先弄清楚一些在XCode环境下的一些概念[4]: Workspace:简单来说,Workspace就是一个容器,在该容器中可以存放多个你创建的Xcode Project, 以及其他的项目中需要使用到的文件. 使用Workspace的好处有: 1),扩展项目的可视域,即可以在多个项目之间跳转,重构,一个项目可以使用另一个项目的输出.Workspace会负责各个Project