ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式之外观模式

2020-11-25 10:30:15  阅读:172  来源: 互联网

标签:外观 void 模式 张无忌 public 使用 设计模式 子系统


概述

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

定义

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

举个栗子

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

外观模式的实现

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

子系统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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有