首页 > 其他分享 >11【门面设计模式】

11【门面设计模式】

时间:2022-12-21 11:38:14浏览次数:48  
标签:11 角色 money 子系统 门面 设计模式 public


文章目录

  • ​​十一、门面设计模式​​
  • ​​11.1 门面设计模式简介​​
  • ​​11.1.1 门面设计模式概述​​
  • ​​11.1.2 门面设计模式中的角色​​
  • ​​11.2 门面设计模式的实现​​
  • ​​11.3 门面设计模式的优缺点​​

十一、门面设计模式

11.1 门面设计模式简介

11.1.1 门面设计模式概述

门面模式(Facade Pattern):也叫外观设计模式,该模式对外有一个统一接口,用来访问子系统中的一群接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

其实我们在写代码时,有意无意的都在大量的使用门面设计模式,但凡高层模块需要调度多个子系统时,我们都会自觉的创建一个新类来封装这些子系统,提供精简的调用方式,让高层模块可以更加容易地间接调用这些子系统的功能;包括我们以前编写的Utils工具类、拦截器、过滤器、网关等都是提供一个调用入口,由这些门面来负责调用复杂的子系统;

门面设计模式主要解决的问题就是:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。

Tips:门面设计模式就是迪米特法则的具体应用;

11.1.2 门面设计模式中的角色

门面设计模式具备如下几个角色:

  • 1)门面角色(Facade):各子系统对外的统一接口,整合各个子系统;
  • 2)子系统角色(SubSystem):实现系统的部分功能,客户通过Facade访问它。

11.2 门面设计模式的实现

【案例】

照顾小孩子需要负责小孩子的饮食起居,包括做饭,洗衣服,遛孩子等等…带一个小孩子非常麻烦,于是我们请到一个保姆来帮助我们干这些事情;

UML类图如下:

11【门面设计模式】_设计模式

  • 子系统角色1-照顾小孩类:
package com.patter.demo;

/**
* @author lscl
* @version 1.0
* @intro: 带孩子-子系统
*/
public class CareChild {
public void doCareChild(String destName) {
System.out.println("遛孩子,带孩子【" + destName + "】...");
}
}
  • 子系统角色2-做饭类:
package com.patter.demo;

/**
* @author lscl
* @version 1.0
* @intro: 做饭-子系统
*/
public class Cooking {

public void doCooking(String menu) {
System.out.println("【给孩子吃" + menu + "】");
}
}
  • 子系统角色3-洗衣服类:
package com.patter.demo;

/**
* @author lscl
* @version 1.0
* @intro: 换洗衣服-子系统
*/
public class Laundry {
public void doLaundry(){
System.out.println("帮孩子换洗衣服...");
}
}
  • 门面角色-保姆类:
package com.patter.demo;

/**
* @author lscl
* @version 1.0
* @intro: 保姆-门面角色
*/
public class BabySister {

private CareChild careChild = new CareChild();
private Cooking cooking = new Cooking();
private Laundry laundry = new Laundry();

// 带孩子经费
private Double money = 4000.0D;

public BabySister(Double money) {
this.money = money;
}

public BabySister() {
}

/**
* 带孩子
*/
public void careChild() {

if (money < 5000.0D) {
careChild.doCareChild("省内游");
} else if (money >= 5000 && money < 8000) {
careChild.doCareChild("国内游");
} else if (money >= 8000) {
careChild.doCareChild("全球游");
}
}

/**
* 做饭
*/
public void cooking() {
if (money < 5000) {
cooking.doCooking("大白菜,豆芽菜");
} else if (money >= 5000 && money < 8000) {
cooking.doCooking("小青菜,辣椒炒肉");
} else if (money >= 8000) {
cooking.doCooking("小青菜,辣椒炒肉,糖醋排骨");
}

}

/**
* 洗衣服
*/
public void laundry() {
laundry.doLaundry();
}
}

11.3 门面设计模式的优缺点

门面设计模式和我们之前的代理设计模式有些许类似,但是却有本质上的不同,代理设计模式主要关注的是对一个类的增强或保护,门面设计模式则是对多个子系统的统一管理;

  • 优点:
  • 1)简化系统的调用过程,用户不需要对子系统有很深的了解,以免给子系统带来风险,符合迪米特法则
  • 2)减少系统依赖,降低耦合
  • 缺点:
  • 1)当子系统升级或扩展时,可能会给门面角色带来未知的风险(门面角色和子系统耦合)
  • 2)当新增子系统时需要添加到门面角色中(修改门面角色),不符合开闭原则
  • 3)在某些情况下,可能违反单一职责原则


标签:11,角色,money,子系统,门面,设计模式,public
From: https://blog.51cto.com/u_15919174/5959164

相关文章

  • 16【责任链设计模式模式】
    文章目录​​十六、责任链设计模式模式​​​​16.1责任链设计模式简介​​​​16.1.1责任链设计模式概述​​​​16.1.2责任链设计模式的UML类图​​​​16.2责任链设......
  • 18【命令设计模式】
    文章目录​​十八、命令设计模式​​​​18.1命令设计模式简介​​​​18.1.1命令设计模式概述​​​​18.1.2命令设计模式的UML类图​​​​18.2命令设计模式的实现​......
  • 06【工厂设计模式】
    文章目录​​六、工厂设计模式​​​​6.1简单工厂设计模式​​​​6.1.1设计需求​​​​6.1.2使用接口改进代码​​​​6.1.3使用简单工厂再改进​​​​6.1.4简单工......
  • 07【建造者设计模式】
    文章目录​​七、建造者设计模式​​​​7.1建造者设计模式简介​​​​7.2建造者设计模式的实现​​​​7.2.1案例引入​​​​1)UML类图如下:​​​​2)建造者设计模式中......
  • 08【代理设计模式】
    文章目录​​八、代理设计模式​​​​8.1结构型设计模式简介​​​​8.2代理设计模式简介​​​​8.2.1代理设计模式概述​​​​8.2.2代理设计模式的UML类图​​​​8......
  • 09【享元设计模式】
    九、享元设计模式9.1享元设计模式简介9.1.1享元设计模式概述享元模式(FlyweightPattern):享元模式主要的任务就是减少对象创建的数量,其宗旨是共享细粒度的对象,将多个对同一......
  • Cpp Primer:Sec 11:关联容器
    Sec11关联容器两个主要的关联容器:map:key-value对,关键字起到索引的作用,值表示与索引关联的数据例子:字典set:每个元素只包含一个关键字,set支持高效的关键字查询操作......
  • 11~12 集合、IO流
    11集合11.1算法和数据结构一、算法:可以解决具体的问题(解决流程),有设计解决的具体的流程(算法1、算法2),有评价这个算法的具体指标(时间复杂度、空间复杂度)二、数据结构:1.......
  • 设计模式-责任链模式
    概念责任链模式是一种行为设计模式就是将一个东西(入参)按步骤顺序处理每一个步骤(一个个实际处理入参的对象:可以抽出公共的接口或抽象类)对应相应的处理方式东西通过......
  • delphi11安卓权限的改变
    delphi11安卓权限的改变///<author>cxg2022-12-21</author>unituRights;interfaceusesSystem.Permissions,System.SysUtils,System.Types,System.UITyp......