设计模式之外观模式
作者:互联网
概述
在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。
软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。
定义
要求一个子系统的外部与内部的通信必须通过一个统一的对象进行。此模式提供一个高层的接口,使得子系统更容易使用。
举个栗子
倚天屠龙记里的张无忌,要想拥有绝世武学,首先得要修炼招式,内功和经脉
外观模式的实现
我们把张无忌当成一个系统。张无忌身为一个武侠,本身分为三个子系统,分别为招式,内功和经脉
子系统1
public class Zhaoshi {
public void TaiJiQuan(){
System.out.println("使用招式太极拳");
}
public void QiShangQuan(){
System.out.println("使用招式七伤拳");
}
public void ShengHuoLing(){
System.out.println("使用招式圣火令");
}
}
子系统2
public class NeiGong {
public void JiuYang(){
System.out.println("使用九阳神功");
}
public void QianKun(){
System.out.println("使用乾坤大挪移");
}
}
子系统3
public class JingMai {
public void Jingmai(){
System.out.println("开启经脉");
}
}
张无忌有很多武学和内功,怎么将他们搭配并对外界隐藏呢?接下来查看外观类
外观类
外观类就是张无忌,他负责将自己的招式,内功和经脉通过不同的情况合理地运用
public class ZhangWuJi {
private JingMai jingmai;
private Zhaoshi zhaoshi;
private NeiGong neiGong;
public ZhangWuJi(){
jingmai = new JingMai();
zhaoshi = new Zhaoshi();
neiGong = new NeiGong();
}
/*使用乾坤大挪移*/
public void QianKun(){
jingmai.Jingmai();//开启经脉
neiGong.QianKun();//使用内功乾坤大挪移
}
/*使用七伤拳*/
public void QiShangQuan(){
jingmai.Jingmai();
neiGong.JiuYang();
zhaoshi.QiShangQuan();
}
}
初始化外观类的同时将各个子系统类创建好。很明显,张无忌很好地将自身的各个系统进行了搭配。如果使用七伤拳。就需要开启经脉,使用内功九阳神功,接下来使用招式七伤拳;如果其不开启经脉或者不使用九阳神功,那么七伤拳的威力会大打折扣。
客户端调用
public class Client {
public static void main(String[] args) {
ZhangWuJi zhangWuJi = new ZhangWuJi();
//张无忌使用乾坤大挪移
zhangWuJi.QianKun();
//张无忌使用七伤拳
zhangWuJi.QiShangQuan();
}
}
当张无忌使用七伤拳的时候,比武对手显然不知道张无忌本身运用了什么,如果每次运用七伤拳都要计划怎么出招,可以想象(脑补:张无忌:开启经脉啊啊啊啊~,开启九阳神~ 对手:小锤锤捶你胸口儿~)
外观模式的使用场景和优缺点
- 使用场景
- 构建一个有层次结构的子系统时,使用外观模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,则可以让其通过外观接口进行通信,减少子系统之间的依赖关系。
- 子系统往往会因为不断地重构演化而变得越来越复杂,大多数的模式使用时也会产生很多很小的类,这给外部调用它们的用户程序带来了使用上的困难。我们用外观类提供了一个简单的接口,对外隐藏子系统的具体实现并隔离变化。
- 当维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展;但因为它含有重要的功能,所以新的需求必须依赖它,这时可以使用外观类。为设计粗糙或者复杂的遗留代码提供一个简单的接口,让新系统和外观类交互,而外观类负责与遗留的代码进行交互。
- 优点
- 减少系统的相互依赖,所有的依赖都是对外观类的依赖,与子系统无关。
- 对用户隐藏了子系统的具体实现,减少用户对子系统的耦合。这样即使具体的子系统发生了变化,用户也不会感知到。
- 加强了安全性,子系统中的方法如果不在外观类中开通,就无法访问到子系统中的方法。
- 缺点
- 不符合开放封闭原则。如果业务出现变更,则可能要直接修改外观类
借鉴《Android进阶之光》刘望舒
标签:外观,void,模式,张无忌,public,使用,设计模式,子系统 来源: https://blog.csdn.net/qq_27647919/article/details/110110314