java设计模式之门面模式
定义:
门面模式又叫做外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式
使用场景:
为一个复杂的模式或者子系统提供一个简洁的供外界访问的接口
希望提高子系统的独立性时
当子系统由于不可避免的暂时原因导致可能存在BUG或者性能相关问题时,可以通过门面模式提供一个高层接口,隔离客户端与子系统的直接交互,预防代码污染
UML类图:
由上图可以看到,门面模式主要包含2个角色。
外观角色(Facade):也叫做门面角色,是系统对外的统一接口
子系统角色(SubSystem):可以同时有一个或者多个SubSystem。每个SubSystem都不是一个单独的类,而是一个类的集合。SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即Facade对与SubSystem透明)
通用写法:
package com.design.pattern.facade;
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.doA();facade.doB();facade.doC();}//子系统Astatic class SystemA{public void doA(){System.out.println("doing A stuff");}}//子系统Bstatic class SystemB{public void doB(){System.out.println("doing B stuff");}}//子系统Cstatic class SystemC{public void doC(){System.out.println("doing C stuff");}}//外观角色static class Facade{private SystemA a= new SystemA();private SystemB b= new SystemB();private SystemC c= new SystemC();//对外接口public void doA(){this.a.doA();}public void doB(){this.b.doB();}public void doC(){this.c.doC();}}
}
实例:
例如一个积分商城,可能涉及到积分系统,支付系统,物流系统的接口调用。如果所有接口调用全部由前端发送网络请求去调用现有接口,一则会增加前端开发人员的难度,二是会增加一些网络请求,影响页面性能。此时就可以发挥门面模式的优势了。将所有现成接口全部整合到一个类中,由后端提供统一的接口供前端调用,这样前端开发人员就不需要关心各接口的业务关系,只需要把精力集中在页面交互上。我们用代码来模拟场景
首先创建礼品的实体类GifyInfo
package com.design.pattern.facade;
public class GiftInfo {private String name;
public GiftInfo(String name) {this.name = name;}
public String getName() {return name;}
}
创建积分系统
package com.design.pattern.facade;
public class QualifyService {public boolean isAvailable(GiftInfo giftInfo){System.out.println("校验" + giftInfo.getName() + "积分资格通过,库存通过");return true;}
}
创建支付系统
package com.design.pattern.facade;
public class PaymentService {public boolean pay(GiftInfo giftInfo){System.out.println("支付" + giftInfo.getName() + "积分成功");return true;}
}
创建物流系统
package com.design.pattern.facade;
public class ShippingService {public String delivery(GiftInfo giftInfo){System.out.println(giftInfo.getName() + "进入物流系统");String shippingOrderNo = "666";return shippingOrderNo;}
}
创建门面系统,对外只开放exchange()方法:
package com.design.pattern.facade;
public class GiftFacadeService {private QualifyService qualifyService = new QualifyService();private PaymentService paymentService = new PaymentService();private ShippingService shippingService = new ShippingService();public void exchange(GiftInfo giftInfo){if (qualifyService.isAvailable(giftInfo)){if (paymentService.pay(giftInfo)){String delivery = shippingService.delivery(giftInfo);System.out.println("物流系统下单成功,订单号是:" + delivery);}}}
}
客户端代码:
package com.design.pattern.facade;
public class ClientTest {public static void main(String[] args) {GiftInfo giftInfo = new GiftInfo("java设计模式");GiftFacadeService f = new GiftFacadeService();f.exchange(giftInfo);}
}
运行结果:
校验java设计模式积分资格通过,库存通过
支付java设计模式积分成功
java设计模式进入物流系统
物流系统下单成功,订单号是:666
门面模式的优点:
简化了调用过程,不用深入了解子系统,以防给子系统带来风险
减少系统依赖,松散耦合
更好的划分访问层次,提高了安全性
遵循迪米特法则
门面模式的缺点:
当增加子系统和扩展子系统行为时,可能同意带来未知的风险
不符合开闭原则
某些情况下,可能违背单一职责原则
java设计模式之门面模式相关推荐
- JAVA设计模式之门面模式(外观模式)
医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其"分而治之",把一个系统划分为几个较小的子系统.如果把医院作为一个子系统,按照部门职能,这个系统可 ...
- Java设计模式分为创建模式, 结构模式, 行为模式 3种类型
Java设计模式之创建模式包括: Factory, 工厂模式 Singleton, 单例模式 Builder, 建造模式 Prototype, 原型模式 Java设计模式之结构模 ...
- 设计模式之门面模式详解
设计模式之门面模式详解 文章目录 设计模式之门面模式详解 一.什么是门面模式 二.门面模式的应用场景 三.门面模式的角色组成 四.门面模式通用写法 五.门面模式在业务中的应用 六.门面模式优缺点 一. ...
- java备忘录模式应用场景_图解Java设计模式之备忘录模式
图解Java设计模式之备忘录模式 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. ...
- 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式
[网络配图] 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.设计 ...
- Java设计模式之策略模式与状态模式
一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...
- Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)
Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...
- Java设计模式(建造者模式-适配器模式-桥接模式)
Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...
- Java设计模式(工厂模式>抽象工厂模式和原型模式)
Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...
最新文章
- GPU加速库AmgX
- Go 学习笔记(28)— nil(nil 不能比较、不是关键字或保留字、nil 没有默认类型、不同类型的 nil 指针是一样的、不同类型的 nil 是不能比较的、相同类型的 nil 可能也无法比较)
- 802.11概述及帧结构分析
- otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用
- C# 如果何从线程中操作控件
- 前端学习(2850):简单秒杀系统学习之绝对定位
- vue弹出alert_vue+webpack 实现简单的弹窗(alert)组件
- VMware converte报错记录
- 使用python来构造有向随机网络
- 云版 Android 系统来了?
- html检查元素是否溢出方法,JS判断指定dom元素是否在屏幕内的方法实例
- 评“CPQuery, 解决拼接SQL的新方法”
- java url压缩_URL压缩算法的短地址
- bzoj 4605: 崂山白花蛇草水
- AMPL 简单运输模型
- 西班牙出差见闻之三(普拉多博物馆)
- 关于Latex中smart pdf反向搜索问题
- 判断101到200之间的素数
- Java分销商城微商城源码跨境电商介绍B2B2C系统
- 案例分享:Qt的PPT播放器
热门文章
- 基于windows中委派的攻击思路(下)-基于资源的约束性委派
- 高中数学怎么学好高中数学零基础怎么学
- Web前端之CSS语法与选择器
- 图片打不开怎么办?只需这样操作
- 一个机械专业小混混 gooogleman 学习嵌入式ARM的真实经历
- BZOJ2277: [Poi2011]Strongbox
- 自监督的暗光图像增强
- 关于时间戳和标准时间、国际标准时间的一些方法
- [精选]大学生实习报告怎么写?
- 飞飞php影视系统源码怎么改,飞飞cms影视系统安装说明 飞飞影视系统建站流程...