关键词:
前言
这次要介绍的是外观模式(也称为门面模式),外观模式也属于结构型模式,其实外观模式还是非常好理解的,简单的来讲就是将多个复杂的业务封装成一个方法,在调用此方法时可以不必关系具体执行了哪些业务,而只关心结果即可。这个场景其实在日常开发中使用的频率还是非常高的,下面来简单了解一下吧。
外观模式
概念介绍
外观模式是隐藏了系统的复杂性,能够为子系统中的一组接口提供一个统一的接口。客户在使用系统时不必和子系统打交道了,降低了客户和子系统间的耦合。
举例
喝茶问题,当纪大烟袋跟和二想喝茶了,这个时候他们就会自己动手,拿茶具,开水,茶叶然后就把茶泡了。过程如下图。
这样两个人都要自己操作茶具,开水,茶叶等,但是其实他俩就是想喝茶,才不关心茶是怎么泡出来的。所以这个时候他们俩就去茶馆了,这样也不用自己动手泡茶了,直接告诉茶馆的店小二儿就行了。此时过程就变成了下面这样的了。
下面用代码来实现一下这个过程:
先获得饮用水
public class DrinkableWater { public DrinkableWater(){ System.out.println("可饮用水准备好了"); } //煮水 public void facadeWater(){ System.out.println("可饮用水沸腾了"); } }
再获得茶叶
public class Tea { public Tea(){ System.out.println("茶叶准备好了。"); } //取茶 public void facadeTea(){ System.out.println("可以泡茶了。"); } }
然后获得茶杯就可以泡茶了。
public class TeaCup { public TeaCup(){ System.out.println("茶杯准备好了"); } //泡茶 public void facadeTeaCup(Tea tea){ tea.facadeTea(); System.out.println("茶叶泡进茶杯了。"); System.out.println("等了一会儿,一杯又香又浓的茶冲好了。"); } }
店小二泡茶
public class Waiter { private DrinkableWater drinkableWater = new DrinkableWater(); private TeaCup teaCup = new TeaCup(); private Tea tea = new Tea(); //获得一杯茶 public void getTea(){ drinkableWater.facadeWater(); teaCup.facadeTeaCup(tea); } }
顾客来喝茶了
public class Customer { public static void main(String[] args) { //叫店小二 Waiter waiter = new Waiter(); //从店小二那获得一杯茶 waiter.getTea(); } }
运行结果
可饮用水准备好了
茶杯准备好了
茶叶准备好了。
可饮用水沸腾了
可以泡茶了。
茶叶泡进茶杯了。
等了一会儿,一杯又香又浓的茶冲好了。
外观模式的分析
外观模式的抽象结构图如下:
在外观模式中主要包含如下几个角色。
1、门面角色(facade):这是外观模式的核心。它被客户角色调用,因此它熟悉子系统的功能。它内部根据客户角色已有的需求预定了几种功能组合。
2、子系统角色(SystemA、SystemB、SystemC):实现了子系统的功能。对子系统角色来说,facade角色与客户角色一样,是未知的,它没有任何facade角色的信息和链接。
3、客户角色(client):调用facade角色来完成要得到的功能。
在上面的泡茶的例子中,和二和纪大烟袋就是客户角色,茶馆店小二儿就是门面角色,茶具、饮用水、茶叶就是子系统角色。
外观模式的优点
1、对客户端屏蔽了子系统组件,减少了客户端处理的对象数量,也减少了客户端的代码量。
2、实现了客户端和子系统的松散耦合,使得子系统个变化不会影响到调用它的客户端,只需要改变外观类即可。
3、一个子系统的变化不会影响到另一个子系统,子系统内部变化也不会影响到外观对象。
外观模式的缺点
1、不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。
2、如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。
适用场景
当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。
客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。
在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
延伸
在上面的例子中,我们定义的门面是一个具体的类,但是当需要增加新的功能的时候,就需要修改门面类了,所以最好的办法是做成抽象门面,也就是将门面类的功能抽象出来,然后又不同的需求的时候,可以做两个具体的门面类。例如:纪大烟袋跟和二去茶馆喝茶是一个门面类,去上街买东西又是另一个门面类。
想了解更多的设计模式请查看Java设计模式学习记录-GoF设计模式概述。
我不慌,世界就不慌。加油吧!
从零开始学习java设计模式|结构型模式篇:外观模式
在本讲,我们来学习一下结构型模式里面的第五个设计模式,即外观模式。概述在向大家讲解外观模式之前,我们先来看一个例子。有些人可能炒过股票,但其实大部分人都是不太懂里面的一些操作的,这种... 查看详情
从零开始学习java设计模式|结构型模式篇:外观模式(代码片段)
在本讲,我们来学习一下结构型模式里面的第五个设计模式,即外观模式。概述在向大家讲解外观模式之前,我们先来看一个例子。有些人可能炒过股票,但其实大部分人都是不太懂里面的一些操作的,这种... 查看详情
java进阶篇设计模式之五-----外观模式和装饰器模式
...户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。简单的来说就是对外提供一个简单接口,隐藏实现的逻辑。比如常用电脑的电源键,我们... 查看详情
设计模式:学习笔记(11)——外观模式
设计模式:学习笔记(11)——外观模式引入外观模式什么是外观模式 外观模式(FacadePattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加... 查看详情
尚硅谷设计模式学习(11)---[外观模式(facade)](代码片段)
...#x1f680;🚀🚀尚硅谷传送门==>B站尚硅谷Java设计模式❤❤❤感谢尚硅谷❤❤❤🕐🕑🕒最近开始计划学习一下设计模式了,加油!!!目录📢情景引入🌈外观模式📢情景引入组建一个家庭影院ÿ... 查看详情
swift设计模式学习-外观模式
移动端访问不佳,请访问我的个人博客设计模式学习的demo地址,欢迎大家学习交流外观模式外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系... 查看详情
《设计模式》学习笔记8——外观模式
定义外观模式引用书中的定义如下:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。外观模式是迪米特... 查看详情
设计模式学习--外观模式
外观模式(Facade):为子系统中的一组接口提供一个一直的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式结构图:案例需求:新股民对股票不熟悉,买基金,基金的专业人士拿新股民的钱... 查看详情
外观模式——headfirst设计模式学习笔记
外观模式:提供了一个统一的接口用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用 特点:将一个或多个类的复杂的一切隐藏在背后,只露出一个干净美好的外观通过提供一个有着更合理接口... 查看详情
java设计模式之外观学习与掌握(代码片段)
文章目录定义优点缺点模式结构与实现模式结构模式的实现模式应用场景定义外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该... 查看详情
java设计模式学习记录-装饰模式
前言装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度。JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一些图形界面构件功能的增强等地方... 查看详情
一天学习一个设计模式之外观模式
外观模式(Facade)又叫门面模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。● 门面(Facade)角色:客户端可以调用这个角色的方法。此角色知晓相关的... 查看详情
java设计模式学习记录-状态模式
前言状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题。状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变。这样在客户端使用... 查看详情
设计模式学习笔记——外观模式(代码片段)
外观模式外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。结构图代码实现子系统:publicclassSubSystemOne publicvoidmethodOne()... 查看详情
java设计模式学习记录-迭代器模式
...次在面试的时候被问到java中的I/O的各种实现用到了什么设计模式,我愣是想半天没想出来了,人家还给提示了我也没想出来,最后还是面试官给出的答案,是装饰模式,听到答案后就恍然大悟了,前两天刚看了装饰模式,还写... 查看详情
java设计模式学习笔记
设计模式分为3大类型共23种:创建型:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型:策... 查看详情
设计模式之外观模式(代码片段)
...出外观模式在源码中的应用进行重点的介绍,最后是我对设计模式学习过程中的一些思考。读者可以拉取完整代码到本地进行学习,实现代码均测试通过后上传到码云。一、引出问题随着小王创业的不断深入,公司各个业务模块... 查看详情
java设计模式-外观模式
目录Java设计模式-外观模式简介外观模式(FacadePattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模... 查看详情