摘要:本文用一个实例场景描述Gof 23设计模式中的门面模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型。
关键字:Gof 23 设计模式 门面模式 Quarkus

1 基础知识
1.1 标准定义
门面(Facade)模式标准定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
1.2 分析和说明
门面(Facade)模式也叫外观模式,属于结构型设计模式。外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
Facade结构如图1所示。其角色包括门面(Facade)角色和子系统(Subsystem)角色。
图1 门面模式结构
 门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
 子系统(Subsystem)角色:可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。每一个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

2 应用场景举例
比如公司总有前台,来访的人员主要是做这几类工作,一类是过来工作,一类是访客,一类是邮差送东西,还有就是领导视察等。但是都是通过前台来实现。应用场景用例见图2.
图2 门面模式用例图
在这里可以把Facade类理解为门面(Facade)角色。DoWork类,Inspection类,Post类和Visit类是子系统(Subsystem)角色。其结构类图如图3所示。Facade类聚合DoWork类,Inspection类,Post类和Visit类等四个类。
图3 门面模式类图
门面模式实现的顺序图见图4。实现顺序描述:① 创建一个门面facade对象;② 分别创建dowork对象、post对象、visit对象、inspection对象; ③-④ 调用facade对象的“dowork”工作,dowork对象调用dowork方法;⑤-⑥ 调用facade对象的“post”工作,post对象调用dowork方法;⑦-⑧调用facade对象的“visit”工作,visi对象调用dowork方法;⑨-⑩调用facade对象的“inspection”工作,inspection对象调用dowork方法。
图4 门面模式实现顺序图
在门面模式的应用中,所有的操作都要经过门面来协调或验证。门面这个高层接口使得各个子系统更容易使用和维护,降低耦合便于扩展。可以解耦关联、增加各部分的独立性.各部分的修改、扩展不影响其他部分,满足组件设计对外提供一致性的要求。

3.Quarkus的实现程序代码
Quarkus程序实现主要包括Facade类文件,DoWork类文件,Inspection类文件,Post类文件和Visit类文件等5个文件。其关系如图3所示。下面分别列出这5个文件的程序代码,最后列出测试代码并显示输出结果。
Facade类程序代码清单01所示。
程序代码清单01

@ApplicationScoped
public class Facade {@InjectVisit visit ;@InjectPost  post ;@InjectInspection inspection;@InjectDoWork doWork;  public void Operate(String operation){if (operation.toLowerCase().equals("visit")) {visit.operate();}else if (operation.equals("post")) {post.operate();}else if (operation.equals("inspection")) {inspection.operate();}else if (operation.equals("doWork")) {doWork.operate();}else System.out.println("没有对应事项,不能工作。");}
}

DoWork类,Inspection类,Post类和Visit类程序代码清单02所示。
程序代码清单02

@ApplicationScoped
public class DoWork {   public void operate(){System.out.println("员工:打卡考勤。");}
}@ApplicationScoped
public class Inspection {   public void operate(){System.out.println("领导视察:端茶倒水。");}
}@ApplicationScoped
public class Post { public void operate(){System.out.println("邮递员:登记收发物品。");}
}@ApplicationScoped
public class Visit {    public void operate(){System.out.println("访客:登记身份证。");}
}

门面模式测试程序的代码清单03如下:
程序代码清单03

public class FacadeClient implements QuarkusApplication {@ConfigProperty(name = "gof23.structuralpattern.facade.title", defaultValue = "gof23")String title;@Inject Facade facade ;@Overridepublic int run(String... args) {        System.out.println("—————" + title + "演示输出—————————");    // 向前台要求访客facade.Operate("visit");// 向前台提交邮品facade.Operate("post");// 领导过来视察facade.Operate("inspection");// 员工上班facade.Operate("doWork");// study是没有对应的工作接口facade.Operate("study");return 0;}public static void main(String... args) {Quarkus.run(FacadeClient.class, args);}
}

门面模式测试类输出结果如下所示:

访客:登记身份证。
邮递员:登记收发物品。
领导视察:端茶倒水。
员工:打卡考勤。
没有对应事项,不能工作。

4. 相关Quarkus程序源码下载
可以直接从github上获取代码,读者可以从github上clone预先准备好的示例代码。

git clone https://github.com/rengang66/quarkus-sample-gof23.git

这是一个Maven项目,然后Maven导入工程。该程序位于“src\main\java\com\iiit\quarkus\sample\gof23\structuralpattern\facade”目录中。
同时也可以从gitee上clone预先准备好的示例代码,命令如下:

git clone https://gitee.com/rengang66/quarkus-sample-gof23.git

5 扩展和说明
Session Facade模式是15种J2EE设计模式中的一种设计模式。基于EJB的应用基本上都是通过调用Facade Session Bean来实现的。使用Facade Session Bean,该Session Bean从更大粒度的业务角度来封装复杂的业务流程,为客户端提供一个更简单的访问界面。Session Facade模式结构图。
图5 Session Facade模式结构图
Client可以是一般的Java Object,或者是Business Delegate或其它的SessionBean等。SessionFacade是一个SessionBean,它负责管理多个BusinessObject,为客户端提供更高级别的访问界面。Client通过SessionFacade完成业务逻辑处理。Business Object业务逻辑处理组件。这样的好处在于:① 担当业务层的控制器角色。②为客户端提供统一简单的接口界面;③ 减少耦合性,提高可管理能力; ④减少网络调用,提供性能;⑤ 安全管理,事务管理等的集中控制;⑥暴露更少的接口给客户端。

参考文献

[1] E.Gamma, R.Helm, R.Johnson, and Vlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley, 1995
[2] E.Gamma, R.Helm, R.Johnson, and Vlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.2000.9.
[3] 阎宏,Java与模式,北京:电子工业出版社. 2002.10
[4] 王俊峰 戚晓滨. 设计模式和UML. 计算机应用研究,1999.16(5), 27-29,39.
[5] 陈琴 朱正强. UML在设计模式描述中的应用. 计算机工程与设计,2003.24(4), 81-84.
[6] 张良平 曾贤龙 王倩. 利用设计模式实现数据访问的泛化. 电脑编程技巧与维护,2008.(10), 33-38.
[7] 曹国民[1,2] 陈根才[1] 施文幸[2]. 基于.NET平台的电力生产管理系统建模与实现. 计算机工程与设计,2008.29(1), 170-172,233.
[8] 常亮 杨宏伟. 设计模式在出/入库管理中的应用研究. 唐山学院学报,2008.21(4), 65-68.
[9] 高瑞明 吴洁明. 基于设计模式数据访问组件的设计和实现. 现代计算机:下半月版,2008.(2), 122-123.
[10] 庄亮 王丽芳 蒋泽军 张羽. .Net平台下基于Facade模式的软件N层架构的设计与实现. 微电子学与计算机,2006.23(7), 75-77.
[11] 潘夕琪 何新英. EJB设计中一种动态会话外观模式的实现策略. 微型电脑应用,2006.22(11), 62-64.
[12] 须文波 黄渌. EJB中的Facade模式原理. 计算机工程与设计,2004.25(12), 2185-2187.
[13] 梁冠敏 刘觉夫. Facade模式在EJB中的应用研究. 华东交通大学学报,2006.(4), 90-92.
[14] 陈平 邢桂芬. Facade模式在JDBC编程中的应用. 计算机工程与设计,2006.27(1), 59-61,69.
[15] 何文孝. Facade设计模式在VB数据库中的应用. 重庆工学院学报,2004.18(2), 30-31,34.
[16] 刘冰 沈文轩. Session facade设计模式在银行代理业务中的应用. 鞍山科技大学学报,2007.30(3), 258-261.
[17] 李卉 殷兆麟 金铁锋. Session Faqade设计模式及其在J2EE系统开发中的应用研究. 计算机工程,2005.31(14), 228-230.
[18] 庄亚俊 聂哲. 改进的会话外观模式在J2EE中的应用与研究. 计算机时代,2006.(3), 49-50.
[19] 渠芳 廉清 钱晓彤. 会话外观设计模式在图书馆个性化推送系统中的应用. 情报探索,2007.(2), 72-74.
[20] 李伟岸 王忠仁 高进. 基于Facade模式的大规模组件切换策略. 成都信息工程学院学报,2005.20(4), 393-397.
[21] 吴立春. 基于Facade模式的业务逻辑层框架设计. 微计算机信息,2007.(24), 245-246,308.
[22] 尹宾 蒋兆远 高溥. 门面(Facade)模式在企业级分布式系统设计中的应用. 甘肃科技,2005.21(3), 40-41.
[23] 李书刚 王乘. 门面设计模式在J2EE中的应用. 微机发展,2005.15(6), 51-53.
[24] 刘诚 魏长军. 消息外观设计模式的研究与应用. 计算机时代,2006.(9), 11-12,19.
[25] 叶建平. 设计模式在游乐设施检测管理信息系统中的应用. 微计算机信息,2005.21(12X), 213-214,77.
[26] Quarkus官网. https://quarkus.io/

10-门面模式Quarkus实现相关推荐

  1. JS设计模式——10.门面模式

    门面模式 这是一种组织性的模式,它可以用来修改类和对象的接口,使其更便于使用.它可以让程序员过得更轻松,使他们的代码变得更容易管理. 门面模式有两个作用: 简化类的接口 消除与使用她的客户代码之间的耦 ...

  2. 颜值10分姐姐带我玩转java设计模式(内附照片)- 门面模式

    先不说话,直接来张姐姐照片,称呼包子姐姐即可,希望包子姐姐能带飞. 原创不易,麻烦先三连,再细看,谢谢 示例的源码可以直接通过csdn下载也可以通过git导出:https://github.com/i ...

  3. 大熊君说说JS与设计模式之(门面模式Facade)迪米特法则的救赎篇------(监狱的故事)...

    一,总体概要 1,笔者浅谈 说起"门面"这个设计模式其实不论新老程序猿都是在无意中就已经运用到此模式了,就像我们美丽的JS程序员一样不经意就使用了闭包处理问题, 1 functio ...

  4. java设计模式face_24种设计模式--门面模式【Facede Pattern】

    大家都写过纸质的信件吧,比如给女朋友写情书什么的,写信的过程大家都还记得吧,先写信的内容,然后写信封,把信放到信封中,封好,投递到信箱中进行邮递,这个过程还是比较简单的,虽然简单,这四个步骤都是要跑的 ...

  5. 15-责任链模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的责任链模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 责任链模式 Quarkus 1 基 ...

  6. 04-原始模型模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的原始模型模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 原始模型模式 Quarkus 1 ...

  7. 设计模式之门面模式详解

    设计模式之门面模式详解 文章目录 设计模式之门面模式详解 一.什么是门面模式 二.门面模式的应用场景 三.门面模式的角色组成 四.门面模式通用写法 五.门面模式在业务中的应用 六.门面模式优缺点 一. ...

  8. 03-建造模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的建造模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 建造模式 Quarkus 1 基础知 ...

  9. 设计模式之禅——门面模式

    门面模式[Facade Pattern]也叫外观模式,是一种比较常用的封装模式,其定义如下: [要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行.门面模式提供一个高层次的接口,使得子系统更 ...

  10. 16-命令模式Quarkus实现

    摘要:本文用一个实例场景描述Gof 23设计模式中的命令(Command)模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型. 关键字:Gof 23 设计模式 命令模式 Quar ...

最新文章

  1. 使用MDT2013部署Win8系统之五-配置MDT服务器之添加任务序列
  2. carsim学习笔记4——路面的一些设置1
  3. 【机器视觉】 dev_error_var算子
  4. Linux RPM包校验和数字证书
  5. linux安装python和pip3,Linux安装python3.6 和pip
  6. 传统到敏捷的转型中,谁更适合做Scrum Master?
  7. 【janino】janino自定义函数报错A method named xx is not declared in any enclosing class nor through a static
  8. IndexedQueueT——C#中的自定义队列
  9. ModelSim使用$display查看变量值和输出信息
  10. python mongodb 设置密码前一篇ok,csv文件存入mongodb
  11. https://www.nowcoder.com/acm/contest/107/F
  12. python deap_Python遗传算法框架DEAP-Creating Types
  13. BZOJ3557: [Ctsc2014]随机数
  14. 【unity 保卫星城】--- 开发笔记02(陀螺仪移动)
  15. ◮OpenGL-混合
  16. [解决]“TypeError: Cannot read property ‘xxx‘ of undefined“
  17. 计算机属性的Java代码_java - 学计算机的人绝不认输 - 博客园
  18. Boolean 的用法及意思
  19. Modbus/Profibus协议转换原理
  20. 简明《Stacked Capsule Autoencoders》

热门文章

  1. STM32硬件SPI时钟频率与时钟解析(基于逻辑分析仪的抓包试验)
  2. Emoji 映射编码
  3. 数字孪生的思考 05 - VAM/XR
  4. Oracle GoldenGate for MySQL部署踩的坑
  5. 打乱魔方软件_家里魔方吃灰了?这三款魔方App教你轻松上手
  6. php 走马灯轮播,JavaScript_js实现DOM走马灯特效的方法,本文实例讲述了js实现DOM走马 - phpStudy...
  7. seacms海洋cms漏洞
  8. 做产品,懂人性,触人心
  9. ElementUI全局配置message的弹窗时间
  10. 前端页面如何获取高德地图