其他分享
首页 > 其他分享> > 设计模式之外观模式

设计模式之外观模式

作者:互联网

概述

在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。
软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。

定义

要求一个子系统的外部与内部的通信必须通过一个统一的对象进行。此模式提供一个高层的接口,使得子系统更容易使用。

举个栗子

倚天屠龙记里的张无忌,要想拥有绝世武学,首先得要修炼招式,内功和经脉

外观模式的实现

我们把张无忌当成一个系统。张无忌身为一个武侠,本身分为三个子系统,分别为招式,内功和经脉

子系统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();
    }
}

当张无忌使用七伤拳的时候,比武对手显然不知道张无忌本身运用了什么,如果每次运用七伤拳都要计划怎么出招,可以想象(脑补:张无忌:开启经脉啊啊啊啊~,开启九阳神~  对手:小锤锤捶你胸口儿~)

外观模式的使用场景和优缺点

  • 使用场景
  1. 构建一个有层次结构的子系统时,使用外观模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,则可以让其通过外观接口进行通信,减少子系统之间的依赖关系。
  2. 子系统往往会因为不断地重构演化而变得越来越复杂,大多数的模式使用时也会产生很多很小的类,这给外部调用它们的用户程序带来了使用上的困难。我们用外观类提供了一个简单的接口,对外隐藏子系统的具体实现并隔离变化。
  3. 当维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展;但因为它含有重要的功能,所以新的需求必须依赖它,这时可以使用外观类。为设计粗糙或者复杂的遗留代码提供一个简单的接口,让新系统和外观类交互,而外观类负责与遗留的代码进行交互。
  • 优点
  1. 减少系统的相互依赖,所有的依赖都是对外观类的依赖,与子系统无关。
  2. 对用户隐藏了子系统的具体实现,减少用户对子系统的耦合。这样即使具体的子系统发生了变化,用户也不会感知到。
  3. 加强了安全性,子系统中的方法如果不在外观类中开通,就无法访问到子系统中的方法。
  • 缺点
  1. 不符合开放封闭原则。如果业务出现变更,则可能要直接修改外观类

借鉴《Android进阶之光》刘望舒

标签:外观,void,模式,张无忌,public,使用,设计模式,子系统
来源: https://blog.csdn.net/qq_27647919/article/details/110110314