Java行为型设计模式之外观设计模式详解

目录
  • 1.外观设计模式定义
  • 2.外观设计模式优点与不足
  • 3.外观设计模式的实现思路
  • 4.外观设计模式代码示例
  • 5.外观模式的应用场景

编程是一门艺术,大批量的改动显然是非常丑陋的做法,用心的琢磨写的代码让它变的更美观。

在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。

软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。

1.外观设计模式定义

外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

在日常编码工作中,我们都在有意无意的大量使用外观模式。只要是高层模块需要调度多个子系统(2个以上的类对象),我们都会自觉地创建一个新的类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。尤其是现阶段各种第三方SDK、开源类库,很大概率都会使用外观模式。

2.外观设计模式优点与不足

外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点:

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
  • 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。

外观(Facade)模式的不足:

  • 不能很好地限制客户使用子系统类,很容易带来未知风险。
  • 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

3.外观设计模式的实现思路

外观(Facade)模式的结构比较简单,主要是定义了一个高层接口。它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。

外观(Facade)模式包含以下主要角色:

  • 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
  • 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
  • 客户(Client)角色:通过一个外观角色访问各个子系统的功能。

4.外观设计模式代码示例

场景介绍:有加包装服务、采摘服务、发货服务,为了方便客户端使用,采用外观设计模式进行设计。

public class PackService {
    /**
     * 水果打包:防伪/加固/加急等
     */
    public void doPack(){
        AbstractFactory factory = new AppleFactory();
        /*得到包装*/
        Bag bag = factory.getBag();
        /*现需要增加防伪标识*/
        /*防伪功能*/
        bag = new CheckedBagDecorator(bag);
        /*加固功能*/
        bag = new ReinforceBagDecorator(bag);
        /*加急功能*/
        bag = new SpeedDecorator(bag);
        bag.pack();
    }
    public void doSomeThine(){
        System.out.println("doSomeThine");
    }
}
public class PickService {
    /**
     * 采摘水果
     */
    public void doPick(){
        //袋子型号
        BagAbstraction pickBag = new SmallBag();
        //袋子材质
        Material material = new Paper();
        pickBag.setMaterial(material);
        //开始采摘
        pickBag.pick();
    }
    public void doSomeThine(){
        System.out.println("doSomeThine");
    }
}
public class SendService {
    /**
     * 指定目的地,发送快递
     */
    public void doSend(){
        //根目录
        DistrictNode root = new DistrictNode("china");
        //一线目录
        root.addChild(new DistrictNode("shang hai"));
        root.addChild(new DistrictNode("tian jin"));
        DistrictNode districtNode = new DistrictNode("bei jing");
        root.addChild(districtNode);
        //二级目录
        districtNode.addChild(new DistrictNode("hai dian qu"));
        districtNode.addChild(new DistrictNode("xi cheng qu"));
        DistrictNode districtNode2 = new DistrictNode("chao yang qu");
        districtNode.addChild(districtNode2);
        //三级目录
        districtNode2.addChild(new LeafNode("san li tun "));
        districtNode2.addChild(new LeafNode("guo mao"));
        System.out.println("请选定目的地:"+ JsonOutput.toJson(root));
        /*以下物流运输业务*/
        System.out.println("本次快递目的地:beijing-chanyangqu-sanlitun");
    }
    public void doSomeThine(){
        System.out.println("doSomeThine");
    }
}
//外观类
public class OrderFacade {
    private PickService pickService;
    private PackService packService;
    private SendService sendService;
    public OrderFacade(){
        pickService = new PickService();
        packService = new PackService();
        sendService = new SendService();
    }
    /**
     * 客户订单处理类
     */
    public void doOrder(){
        /*采摘*/
        System.out.println("--------------");
        pickService.doPick();
        /*包装*/
        System.out.println("--------------");
        packService.doPack();
        /*快递*/
        System.out.println("--------------");
        sendService.doSend();
    }
}
 public static void main(String[] args){
        OrderFacade orderFacade = new OrderFacade();
        orderFacade.doOrder();
    }

5.外观模式的应用场景

通常在以下情况下可以考虑使用外观模式:

  • 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

到此这篇关于Java行为型设计模式之外观设计模式详解的文章就介绍到这了,更多相关Java外观模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java设计模式之浅谈外观模式

    目录 简介 外观模式之理解 实例 ①.定义子系统 ②.外观类 ③.测试 好文推荐 简介 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用. 外观模式之理解 对于外观模式,我们可以理解为他是将一些复杂的接口或类进行隐藏,自己暴露出更为简单的操作方法,使得以我们不需要去对复杂方

  • 深入理解Java设计模式之外观模式

    目录 一.什么是外观模式 二.外观模式的使用场景 三.外观模式的优缺点 四.外观模式的实现 总结 一.什么是外观模式 定义:为子系统中的一组接口提供一个一致的界面,用来访问子系统中的一群接口. 外观模式组成: Facade:负责子系统的的封装调用 Subsystem Classes:具体的子系统,实现由外观模式Facade对象来调用的具体任务 二.外观模式的使用场景 1.设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式: 2.开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调

  • Java设计模式之外观模式示例详解

    目录 定义 案例 需求 方案:外观模式实现 分析 总结 定义 外观模式为多个复杂的子系统,提供了一个一致的界面,使得调用端只和这个接口发生调用,而无须关系这个子系统内部的细节 案例 需求 看电影的时候需要进行一系列的操作,比如打开播放器,放下屏幕,打开投影仪,打开音响等,这个要怎么进行管理呢 方案:外观模式实现 定义播放器类 public class Player { private static Player player = new Player(); private Player(){}

  • Java设计模式中的外观模式详解

    目录 模式介绍 UML类图 外观模式案例: 外观模式的注意事项和细节 模式介绍 外观模式(Facade) ,也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节. UML类图 类图解析: Facade:为调用端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象

  • Java设计模式之外观模式

    本文通过老王改造小王公司的整体架构来说明外观模式,所谓的外观模式其实就是在各种复杂的子系统中抽象出来一个接口,隐藏具体的实现细节,调用方调用时只需要调用接口即可.为了加深理解我们会选出外观模式在源码中的应用进行重点的介绍,最后是我对设计模式学习过程中的一些思考. 读者可以拉取完整代码到本地进行学习,实现代码均测试通过后上传到码云. 一.引出问题 随着小王创业的不断深入,公司各个业务模块越来越复杂,每当客户们与他的合作时都要深入各个模块内部,而且客户要依赖小王的各个模块,给使用模块的客户带来了困难

  • 深入理解JavaScript系列(30):设计模式之外观模式详解

    介绍 外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模块定义了一个高层接口,这个接口值得这一子系统更加容易使用. 正文 外观模式不仅简化类中的接口,而且对接口与调用者也进行了解耦.外观模式经常被认为开发者必备,它可以将一些复杂操作封装起来,并创建一个简单的接口用于调用. 外观模式经常被用于JavaScript类库里,通过它封装一些接口用于兼容多浏览器,外观模式可以让我们间接调用子系统,从而避免因直接访问子系统而产生不必要的错误. 外观模式的优势是易于使用,而且本身也比较轻量

  • Java设计模式之原型模式详解

    一.前言 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式.在实际应用中,原型模式很少单独出现.经常与其他模式混用,他的原型类Prototype也常用抽象类来替代. 该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.在Java中,复制对象是通过clone()实现的,先创建一个原型类,通过实现Cloneable 接口 public class Prototype implements Cloneable { public

  • java 中设计模式(装饰设计模式)的实例详解

    java 中设计模式(装饰设计模式)的实例详解 应用场景: 在不对原有对象类进行修改的基础上,给一个或多个已有的类对象提供增强额外的功能. 我觉得可以从字面理解,装饰,装饰房子.房子可以看成原有的类.等于你把一个已经建好的房子按照自己的想法再装饰一遍.继承也可以实现这样的功能,但是继承有它的缺点,继承只是单一继承.装饰设计模式可以取多个不同的类的不同功能. 具体步骤: ◎第1步:通过构造传参把需要加强的类传过来.(你要装修房子,肯定的先有房子吧.这个很好理解) ◎第2步:把具体需要增强的功能写了

  • java 设计模式之适配器模式的详解

    java 设计模式之适配器模式的详解 前言: 适配器模式(Adapter Pattern)又叫做变压器模式,也叫做包装模式.包装模式还包括装饰模式. 在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的. 一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. UML类图:  具体代码: public class Client { public static void main(String[] args)

  • Java设计模式之命令模式详解

    命令模式 定义:将请求封装成对象,这可以让你使用不同的请求.队列.或者日志来参数化其他对象. 何时使用命令模式?当需要将发出请求的对象和执行请求的对象解耦的时候,使用命令模式. 在被解耦的两者之间是通过命令对象进行沟通的.命令对象封装了接收者和一个或一组动作. 调用者通过调用命令对象的execute()方法发出请求,这会使接收者的动作被调用. 调用者可以接收命令当作参数,甚至在运行时动态地进行. 优点: 1.降低了系统耦合度. 2.新的命令可以很容易添加到系统中去. 缺点:使用命令模式可能会导致

  • Java设计模式之代理模式详解

    一.代理模式 代理模式就是有一个张三,别人都没有办法找到他,只有他的秘书可以找到他.那其他人想和张三交互,只能通过他的秘书来进行转达交互.这个秘书就是代理者,他代理张三. 再看看另一个例子:卖房子 卖房子的步骤: 1.找买家 2.谈价钱 3.签合同 4.和房产局签订一些乱七八糟转让协议 一般卖家只在签合同的时候可能出面一下,其他的1,2,4都由中介去做.那你问这样有什么用呢? 首先,一个中介可以代理多个卖房子的卖家,其次,我们可以在不修改卖家的代码的情况下,给他实现房子加价.打广告等等夹带私货的

  • Java设计模式之单例模式示例详解

    目录 0.概述 1.饿汉式 1.1 饿汉式单例实现 1.2 破坏单例的几种情况 1.3 预防单例的破坏 2.枚举饿汉式 2.1 枚举单例实现 2.2 破坏单例 3.懒汉式 4.双检锁懒汉式 5.内部类懒汉式 6.JDK中单例的体现 0.概述 为什么要使用单例模式? 在我们的系统中,有一些对象其实我们只需要一个,比如说:线程池.缓存.对话框.注册表.日志对象.充当打印机.显卡等设备驱动程序的对象.事实上,这一类对象只能有一个实例,如果制造出多个实例就可能会导致一些问题的产生,比如:程序的行为异常.

  • Java设计模式探究之观察者模式详解

    目录 1.观察者模式是什么 2.如何实现 3.代码实现 1)观察者接口 2)被观察者接口 3)观察者实现 4)被观察者实现 5)测试类 4.延伸拓展 1.观察者模式是什么 顾名思义,有两个对象,观察者和被观察者.当被观察者数据发生变化时,提醒观察者更新数据或状态. 2.如何实现 1)定义两个类,观察者和被观察者. 2)被观察者要维护一个集合,存放观察者对象.并且提供增删方法. 3)被观察者数据发生变化时,要调用观察者的方法,以便通知观察者更新数据或状态. 4)基于面向抽象原则,可以将观察者和被观

  • Java结构型设计模式之组合模式详解

    目录 组合模式 应用场景 优缺点 主要角色 组合模式结构 分类 透明组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 安全组合模式 创建抽象根节点 创建树枝节点 创建叶子节点 客户端调用 组合模式 组合模式(Composite Pattern)也称为整体-部分(Part-Whole)模式,属于结构型模式. 它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户端对单个对象和组合对象的使用具有一致性. 组合模式一般用来描述整体与部分的关系,它将对象

随机推荐

其他