定义:

门面模式又叫做外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式

使用场景:

  1. 为一个复杂的模式或者子系统提供一个简洁的供外界访问的接口

  2. 希望提高子系统的独立性时

  3. 当子系统由于不可避免的暂时原因导致可能存在BUG或者性能相关问题时,可以通过门面模式提供一个高层接口,隔离客户端与子系统的直接交互,预防代码污染

UML类图:

由上图可以看到,门面模式主要包含2个角色。

  1. 外观角色(Facade):也叫做门面角色,是系统对外的统一接口

  2. 子系统角色(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

门面模式的优点:

  1. 简化了调用过程,不用深入了解子系统,以防给子系统带来风险

  2. 减少系统依赖,松散耦合

  3. 更好的划分访问层次,提高了安全性

  4. 遵循迪米特法则

门面模式的缺点:

  1. 当增加子系统和扩展子系统行为时,可能同意带来未知的风险

  2. 不符合开闭原则

  3. 某些情况下,可能违背单一职责原则

java设计模式之门面模式相关推荐

  1. JAVA设计模式之门面模式(外观模式)

    医院的例子 现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其"分而治之",把一个系统划分为几个较小的子系统.如果把医院作为一个子系统,按照部门职能,这个系统可 ...

  2. Java设计模式分为创建模式, 结构模式, 行为模式 3种类型

    Java设计模式之创建模式包括: Factory,    工厂模式 Singleton,   单例模式 Builder,    建造模式 Prototype,    原型模式 Java设计模式之结构模 ...

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

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

  4. java备忘录模式应用场景_图解Java设计模式之备忘录模式

    图解Java设计模式之备忘录模式 游戏角色状态恢复问题 游戏角色有攻击力和防御力,在大战Boss前保存自身的状态(攻击力和防御力),当大战Boss后攻击力和防御力下降,从备忘录对象恢复到大战前的状态. ...

  5. 一看就懂!【英雄联盟锐雯】与 Python 详解设计模式之门面模式

    [网络配图] 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结.使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性.设计 ...

  6. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  7. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  8. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  9. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

最新文章

  1. GPU加速库AmgX
  2. Go 学习笔记(28)— nil(nil 不能比较、不是关键字或保留字、nil 没有默认类型、不同类型的 nil 指针是一样的、不同类型的 nil 是不能比较的、相同类型的 nil 可能也无法比较)
  3. 802.11概述及帧结构分析
  4. otsu自适应阈值分割的算法描述和opencv实现,及其在肤色检测中的应用
  5. C# 如果何从线程中操作控件
  6. 前端学习(2850):简单秒杀系统学习之绝对定位
  7. vue弹出alert_vue+webpack 实现简单的弹窗(alert)组件
  8. VMware converte报错记录
  9. 使用python来构造有向随机网络
  10. 云版 Android 系统来了?
  11. html检查元素是否溢出方法,JS判断指定dom元素是否在屏幕内的方法实例
  12. 评“CPQuery, 解决拼接SQL的新方法”
  13. java url压缩_URL压缩算法的短地址
  14. bzoj 4605: 崂山白花蛇草水
  15. AMPL 简单运输模型
  16. 西班牙出差见闻之三(普拉多博物馆)
  17. 关于Latex中smart pdf反向搜索问题
  18. 判断101到200之间的素数
  19. Java分销商城微商城源码跨境电商介绍B2B2C系统
  20. 案例分享:Qt的PPT播放器

热门文章

  1. 基于windows中委派的攻击思路(下)-基于资源的约束性委派
  2. 高中数学怎么学好高中数学零基础怎么学
  3. Web前端之CSS语法与选择器
  4. 图片打不开怎么办?只需这样操作
  5. 一个机械专业小混混 gooogleman 学习嵌入式ARM的真实经历
  6. BZOJ2277: [Poi2011]Strongbox
  7. 自监督的暗光图像增强
  8. 关于时间戳和标准时间、国际标准时间的一些方法
  9. [精选]大学生实习报告怎么写?
  10. 飞飞php影视系统源码怎么改,飞飞cms影视系统安装说明 飞飞影视系统建站流程...