常用设计模式系列(十一)—外观模式
常用设计模式系列(十一)—外观模式
第一节
前言
截止目前,我已经完成十一篇设计模式的原创文章,设计模式已经完成十个章节,我也收获了一丢丢粉丝,未来的日子有各位大佬的陪伴,我也会更加努力的高产。今天讲解对象结构型设计模式第四章节—外观模式,什么是外观模式呢?“外观”一词比较抽象,虽然这个模式不能够通过名称来一眼看出实现的过程,但是可以这么理解,一个看着漂亮又完整的整体,其实是有许多小的部分组成,一个光芒绽放的人,也是肯定一身技能在身,找到这个人,他就能做好几个人能完成的事情,他这个人本身就集中了许多人的优点。
第二节
外观模式
外观(Facade)模式又叫做门面模式,属于较为简单的一种设计模式,是通过将多个复杂的子系统进行整合,然后提供一个统一的接口,使这些子系统更加容易被访问的模式。几个子系统集中到一起时,这个模式就对外只有一个统一接口,可以访问子系统的方法,外部的程序不用关心内部系统实现的具体细节,在我们开发的过程中,许多人就会不自觉的使用外观模式。
其实这个模式很好理解,将多个子类在一个统一类进行整合,然后整合类作为统一入口使用,例如在项目开发过程中,我们的control(控制)层去调用service层进行实现,service层是整合了多个dao来完成业务开发,或者service层依赖别的service层,融合到一起,入口为这个整合的service类,control可以通过service查找dao层去数据库查询的数据,这样就能完成外观模式。
注意:外观模式就是将多个子系统的入口进行整合,在同一的接口完成,三个系统分别是三个入口,在这个接口中就是三个方法。
一个朋友离职以后,换了一家新的公司,然后到了新的城市需要租房子,为了快速找到房子,这个朋友就找到了房产中介,他考虑的是一室一厅或者两室一厅的房子,这个房产中介就拿着两把钥匙带着朋友看房子去了,你可以理解为中介就是外观角色,整合了资源,但是资源数不变,每个房东的房子在这里汇聚,真正的房东的房子就是子系统,房产公司就是抽象外观角色。
第三节
代码实现
本次代码实现使用一个外观角色完成,多个外观角色同理
1.创建子系统A和子系统B
package com.yang.facade;/*** @ClassName SubSystemOne* @Description 子系统——房东A* @Author IT小白架构师之路* @Date 2020/12/21* @Version 1.0**/
public class SubSystemOne {/*** 一室一厅的房子*/public void oneRoom(){System.out.println("一室一厅的房子");}
}package com.yang.facade;/*** @ClassName SubSystemTwo* @Description 子系统-房东B* @Author IT小白架构师之路* @Date 2020/12/21* @Version 1.0**/
public class SubSystemTwo {/*** 两室一厅的房子*/public void twoRoom(){System.out.println("两室一厅的房子");}
}
2.创建抽象外观角色
package com.yang.facade;/*** @ClassName OrderService* @Description 抽象外观* @Author IT小白架构师之路* @Date 2020/12/21* @Version 1.0**/
public interface AbstractFacade {/*** 一室一厅*/public void oneRoom();/*** 两室一厅*/public void twoRoom();
}
3.创建外观角色
package com.yang.facade;/*** @ClassName Facade* @Description 外观角色(前台接待人员)* @Author IT小白架构师之路* @Date 2020/12/21* @Version 1.0**/
public class Facade implements AbstractFacade {//房东Aprivate SubSystemOne subSystemOne = new SubSystemOne();//房东Bprivate SubSystemTwo subSystemTwo = new SubSystemTwo();/*** 一室一厅*/public void oneRoom() {System.out.println("中介带着看房子");subSystemOne.oneRoom();}/*** 两室一厅*/public void twoRoom() {System.out.println("中介带着看房子");subSystemTwo.twoRoom();}
}
4.创建客服端进行测试
package com.yang.facade;/*** @ClassName Client* @Description 注释* @Author IT小白架构师之路* @Date 2020/12/21* @Version 1.0**/
public class Client {public static void main(String[] args) {//外观对象AbstractFacade facade = new Facade();System.out.println("去看房子");System.out.println("-----------------分割线---------------");facade.oneRoom();System.out.println("-----------------分割线---------------");facade.twoRoom();}
}
5.测试结果如下,完成了外观模式的职责
去看房子
-----------------分割线---------------
中介带着看房子
一室一厅的房子
-----------------分割线---------------
中介带着看房子
两室一厅的房子
第四节
外观模式优缺点及适用场景分析
优点:
可以将系统中多个功能的接口进行整合,在一个类中进行聚合,方便客户端使用。
外观模式降低了客户端与子系统之间的耦合度
对客户端屏蔽了子系统组件,减少了客户端使用的对象数量,也屏蔽了处理过程
缺点:
增加新的子系统时,需要修改外观角色和客户端代码,违背了设计模式的“开闭原则”。
子系统能被任何外观类使用,后期改造风险增加
适用场景:
适用于一个系统内部接口较为复杂,但需要提供统一接对外调用的场景。
当客户端使用的子系统对象过多且臃肿时,可以引入外观模式改造,提高独立性。
系统中分层进行开发时,外观模式可以隔离不同层的调用关系错乱,统一管理。
扫描二维码
关注我吧
IT小白架构师之路