十三、外观模式—— 简化接口 #和设计模式一起旅行#

我不想成为上帝或英雄,只想成为一棵树,为岁月而生长,不伤害任何人。 ——米沃什故事背景在英国体验了康桥的魅力,我挥一挥衣袖,不带走一片云彩,但是 英国的天空没有留下我的痕迹,但我曾去过。哈哈!从英国到法国,在浪漫的巴黎,我和设计模式MM感受到这个城市别样的风景,很是吸引人,我们决定在这里待一段时间在走。于是去政府部门办理一些手续,本来以为会花费很多时间的,因为之前办…

大家好,又见面了,我是全栈君。

我不想成为上帝或英雄,只想成为一棵树,为岁月而生长,不伤害任何人。 ——米沃什

故事背景

在英国体验了康桥的魅力,我挥一挥衣袖,不带走一片云彩,但是 英国的天空没有留下我的痕迹,但我曾去过。哈哈!

从英国到法国,在浪漫的巴黎,我和设计模式MM感受到这个城市别样的风景,很是吸引人,我们决定在这里待一段时间在走。

于是去政府部门办理一些手续,本来以为会花费很多时间的,因为之前办理总是要去很多个办公室才能搞定,没想到,这次很快,在大厅的窗口就一次性办理好了。

设计模式MM说:这个套路很像一种设计模式-外观模式 。

这个设计模式主要用于在一个大的系统有多个子系统的时候,多个子系统肯定要互相通信,但是每个子系统又不能将内部的过多数据暴露给其他系统,不然就没有必要划分子系统了

就如之前要去办理一个业务,要去A办公室(A系统)去填报,填好表在去B办公室(B系统)盖章,然后去C办公室(C系统)打印,然后将表交给D办公室(D系统)等等的操作,每一个人都要进行这个繁琐的流程。现在只需要去一个窗口登记个人信息,就ok了!

两种办理业务的简单图示

在软件开发中,有时候为了完成一项较为复杂的功能,一个客户类需要和多个业务类交互,而这些需要交互的业务类经常会作为一个整体出现,由于涉及的类比较多,导致使用时候代码较为复杂,此时特别需要一个类似“业务办理窗口”这样的一个角色。由它来负责和多个系统进行交互,而客户端只需要与该类交互即可。

外观模式示意图

故事主角

外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层的接口,让客户端更容易使用。

外观模式

外观模式又称为门面模式,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。

外观模式包含两个角色:

  • Facade(外观角色):客户端可以调用它的方法,在外观角色中科院知道相关的子系统的功能和责任。

  • subSystem(子系统角色):可以有一个或者多个子系统,每个子系统实现各自个功能,子系统被外观角色调用。

    简单代码表示:

class SubSystemA
{
    public void MethodA()
    {
        //业务实现代码
    }
}

class SubSystemB
{
    public void MethodB()
    {
        //业务实现代码
     }
}

class SubSystemC
{
    public void MethodC()
    {
        //业务实现代码
    }
}


class Facade
{
    private SubSystemA obj1 = new SubSystemA();
    private SubSystemB obj2 = new SubSystemB();
    private SubSystemC obj3 = new SubSystemC();

    public void Method()
    {
        obj1.MethodA();
        obj2.MethodB();
        obj3.MethodC();
    }
}
class Test
{
    public static void main(string[] args)
    {
        Facade facade = new Facade();
        facade.Method();
    }
}

武功修炼

public class OfficeA{

    public void doWork(){
        System.out.println("--办公室A-填表-----");
    }

}
public class OfficeB {

    public void doWork(){
        System.out.println("--办公室B-盖章-----");
    }

}

public class OfficeC {


    public void doWork(){
        System.out.println("--办公室C--复印----");
    }
}

public class OfficeD {

    public void doWork(){
        System.out.println("--办公室D--交表----");
    }
}

public class OfficeFacade {

    private OfficeA officeA = new OfficeA();
    private OfficeB officeB = new OfficeB();
    private OfficeC officeC = new OfficeC();
    private OfficeD officeD = new OfficeD();

    public void doWork(){
        officeA.doWork();
        officeB.doWork();
        officeC.doWork();
        officeD.doWork();
    }

}
public class Client {

    public static void main(String[] args) {
        //客户只需要面对门面的窗口即可,不需要关注子系统是如何工作的
        OfficeFacade facade = new OfficeFacade();
        facade.doWork();
    }
}
--办公室A-填表-----
--办公室B-盖章-----
--办公室C--复印----
--办公室D--交表----

上面的示例代码是很简单的,只是为了说明这个模式的,真实的系统设计比这个负责的多。

外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便

只要细心观察,会发现很多框架中使用了改设计模式,在Spring中,在Tomcat中都能发现此设计模式的身影。

总结

优点

  • 使客户端代码变得简单,屏蔽关联对象/组件。
  • 子系统与客户端之间的松耦合关系,客户端,只需要调整外观类即可。

缺点

  • 设计不当 ,在增加新的子系统的时候需要修改外观类的代码,违反开闭原则。
  • 不能很好的限制客户端直接使用子系统。

适用场景

  • 当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。
  • 客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。
Next 期待下一篇吧!下一篇讲讲迭代器!

参考

本专栏文章列表

一、设计模式-开篇—为什么我要去旅行? #和设计模式一起旅行#
二、设计模式-必要的基础知识—旅行前的准备 #和设计模式一起旅行#
三、设计模式介绍—她是谁,我们要去哪里? #和设计模式一起旅行#
四、单例模式—不要冒充我,我只有一个! #和设计模式一起旅行#
五、工厂模式—旅行的钱怎么来 #和设计模式一起旅行#
六、策略模式—旅行的交通工具 #和设计模式一起旅行#
七、观察者模式——关注我,分享旅途最浪漫的瞬间! #和设计模式一起旅行#
八、装饰者模式—巴厘岛,奶茶店的困扰! #和设计模式一起旅行#
九、命令模式—使用命令控制奶茶店中酷炫的灯 #和设计模式一起旅行#
十、模板方法模式—制作更多好喝的饮品! #和设计模式一起旅行#
十一、代理模式 —专注,做最好的自己!#和设计模式一起旅行#
十二、适配器模式——解决充电的烦恼 #和设计模式一起旅行#
十三、外观模式—— 简化接口 #和设计模式一起旅行#
十四、迭代器模式—— 一个一个的遍历 #和设计模式一起旅行#
十五、组合模式—— 容器与内容的一致性 #和设计模式一起旅行#
十六、状态模式—用类表示状态 #和设计模式一起旅行#
十七、访问者模式-访问数据结构并处理数据 #和设计模式一起旅行#
十八、职责链模式-推卸责任,不关我的事,我不管!#和设计模式一起旅行#
十九、原型模式—通过复制生产实例 #和设计模式一起旅行#
二十、设计模式总结—后会有期 #和设计模式一起旅行#


如果您觉得这篇博文对你有帮助,请点赞或者喜欢,让更多的人看到,谢谢!

如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!
祝你今天开心愉快!


欢迎访问我的csdn博客,我们一同成长!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

博客首页 : http://blog.csdn.net/u010648555

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121089.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • JAVA设计模式初探之组合模式

    先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。”   就拿剪发办卡的事情来分析一下吧。   首先,一张卡可以在总部,分店,加盟店使用,那么总部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,这个属性结构的店面层级关系就明确啦。   那么,总店刷卡消费与分店刷卡消费是一样的道理,那么总店与分店对会员卡的使用

  • 软件架构与设计模式_软件架构设计

    软件架构与设计模式_软件架构设计什么是架构?软件体系结构通常被称为架构,指可以预制和可重构的软件框架结构。架构尚处在发展期,对于其定义,学术界尚未形成一个统一的意见,而不同角度的视点也会造成软件体系结构的不同理解,以下是一些主流的标准观点。ANSI/IEEE610.12-1990软件工程标准词汇对于体系结构定义是:“体系架构是以构件、构件之间的关系、构件与环境之间的关系为内容的某一系统的基本组…

  • JAVA设计模式之门面模式(外观模式)[通俗易懂]

    医院的例子  现代的软件系统都是比较复杂的,设计师处理复杂系统的一个常见方法便是将其“分而治之”,把一个系统划分为几个较小的子系统。如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等。看病的病人要与这些部门打交道,就如同一个子系统的客户端与一个子系统的各个类打交道一样,不是一件容易的事情。  首先病人必须先挂号,然后门诊。如果医生要求化验,病人必

  • java设计模式1,单一职责原则

    java设计模式1,单一职责原则单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。

  • MVC设计模式和三层结构(适合初学者)

    MVC设计模式和三层结构(适合初学者)题外话:我们经常把MVC模式和三层架构联系在一起,一旦让你谈谈MVC设计模式,不可避免的总是会说到三层架构,这对于一些高手和大佬来说并没有什么问题,但是对于一些新手,想要学习MVC设计模式的小白来说,有时候就不太友好了。大多人(包括我)刚开始学的时候,大部分都是看大佬们的博客学习,但是正是如此,被大佬们的博客搞得头晕,很容易将MVC设计模式和三层架构搞混,或者以为是同一个东西,…

  • 设计模式(五)适配器模式Adapter(结构型)

    设计模式(五)适配器模式Adapter(结构型)设计模式(五)适配器模式Adapter(结构型)1.概述:接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化。例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器。………

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号