系列文章目录
创建型模式 - 单例模式(一)
创建型模式 - 工厂模式(二)
创建型模式 - 原型模式(三)
创建型模式 - 建造者模式(四)
结构型模式 - 适配器模式(一)
结构型模式 - 桥接模式(二)
结构型模式 - 装饰器模式(三)
结构型模式 - 组合模式(四)
结构型模式 - 外观模式(五)
结构型模式 - 享元模式(六)
结构型模式 - 代理模式(七)
行为型模式 - 模板方法模式(一)
行为型模式 - 命令模式(二)
行为型模式 - 访问者模式(三)
行为型模式 - 迭代器模式(四)
行为型模式 - 观察者模式(五)
行为型模式 - 中介者模式(六)
行为型模式 - 备忘录模式(七)
行为型模式 - 解释器模式(八)
行为型模式 - 状态模式(九)
行为型模式 - 策略模式(十)
行为型模式 - 责任链模式(十一)
文章目录
前言
一、外观模式
1.1 外观模式介绍
- 外观(Facade)模式:
- 又叫门面模式,是一种
通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式
;- 外观(Facade)模式对外有一个统一接口,外部应用程序不用关系内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性;
1.2 外观模式结构
- 外观(Facade)角色:
- 为多个子系统对外提供一个共同的接口;
- 子系统(Sub System)角色:
- 模块或者子系统,处理Facade对象指派的任务,它是功能的实际提供者;
- 客户端(Client)角色:
- 外观接口的调用者;
二、实现
例子:
- 小孩要上幼儿园,要去公安局办理落户,去社保局转移社保,教育局分配学校,怎么实现?
- 这样一层一层的办理太麻烦,为了给家长减负,微信提供了一个小程序,一键办理,多香 !
2.1 普通实现
package com.dozezz.designpattern.facade.normal;
public class Police {
public void register(String name){
System.out.println(String.format("%s ,您已成功落户。。。", name));
}
}
package com.dozezz.designpattern.facade.normal;
/**
* @Description:
* @Author: dozezz
* @Date: 2021/7/20 15:42
* @Version: 1.0
*/
public class Edu {
public void handleEdu(String name){
System.out.println(String.format("%s ,您的孩子可以明天去XX报道上学了。。。", name));
}
}
package com.dozezz.designpattern.facade;
import com.dozezz.designpattern.facade.normal.Edu;
import com.dozezz.designpattern.facade.normal.Police;
import com.dozezz.designpattern.facade.normal.Social;
public class ClientTest {
public static void main(String[] args) {
Police police = new Police();
police.register("张三");
Social social = new Social();
social.handleSocial("张三");
Edu edu = new Edu();
edu.handleEdu("张三");
}
}
优缺点:
- 在ClientTest中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程混乱,没有清晰的过程;
- 不利于在ClientTest中,去维护对子系统的操作;
- 解决思路:通过定义一个一致的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关系这个子系统的内部细节 == 》 外观模式;
2.2 外观模式实现
- 从原来的“客户端需要跟多个子系统进行交互”转变为“只与Facade进行交互”,将客户端与子系统进行解耦,降低耦合性,也降低使用的复杂度;
package com.dozezz.designpattern.facade.facade;
import com.dozezz.designpattern.facade.normal.Edu;
import com.dozezz.designpattern.facade.normal.Police;
import com.dozezz.designpattern.facade.normal.Social;
public class WechatFacade {
Police police = new Police();
Social social = new Social();
Edu edu = new Edu();
public void handle(String name){
police.register(name);
social.handleSocial(name);
edu.handleEdu(name);
}
}
package com.dozezz.designpattern.facade;
import com.dozezz.designpattern.facade.facade.WechatFacade;
public class ClientTest {
public static void main(String[] args) {
WechatFacade facade = new WechatFacade();
facade.handle("张三");
}
}
三、外观模式总结
3.1 外观模式应用场景
- 需要为一个复杂的子系统提供一个简单的接口或希望子系统能够更加独立时,可以考虑使用外观模式。借助于外观模式,可以实现客户端与子系统的解耦,减少客户端对子系统的依赖性;
- 在多层次结构的系统中,可以使用Facade模式进行层与层之间的交互,将层与层之间的耦合性降低,使他们仅仅通过Facade进行交互;
3.2 外观模式优缺点
- 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类;
- 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易;
- 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程;
- 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好,要以让系统有层次,利于维护为目的;
- 通过Facade ,大大减少了客户端所需处理的对象的数目,但是,如果子系统发生变化,Facade则极有可能需要面临修改,这不符合开闭原则;
四、参考文献
- http://c.biancheng.net/view/1354.html
- https://www.bilibili.com/video/BV1G4411c7N4?p=81
- https://www.cnblogs.com/noteless/p/10058164.html