【设计模式系列】通俗易懂的门面模式
这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战
前言
最近同事二狗子要装修房子,他装修之前呢,得先找个设计师设计,然后还需要找个水电工给新房子改水电,再然后,还得找泥瓦工,刷墙贴瓷砖之类的,这个过程中要招人,谈价钱,跟进度,二狗子一个写代码的程序员,他哪会这些呀,太麻烦了,要是有人能帮他干就好了。
哎,这事儿好办呀,找个装修公司呀。
有了装修公司,二狗子就只需要和装修公司谈好价钱,然后等房子装修就好,不用再操心一些细节。
这和我们今天讲的门面设计模式是一个道理。
门面模式定义
GoF门面设计模式定义:为子系统中的一组接口提供统一的接口。门面模式定义了使子系统更易于使用的高级接口。
门面设计模式(Facade Design Pattern)是结构设计模式中的一种,门面模式的作用是为了帮助客户端更容易地与系统交互。
门面模式结构
我们来看一下,在上面的例子中,都需要有些什么元素。
子系统
在上面的例子中,我们首先需要有设计师,水电工,泥瓦匠这些功能对应的接口,供门面(装修公司)来使用。
设计师
/**
* @author 小黑说Java
* @ClassName Designer
* @Description 设计师
* @date 2021/11/14
**/
public class Designer {
public void design() {
System.out.println("设计师设计");
}
}
水电工
/**
* @author 小黑说Java
* @ClassName WaterElectricWorker
* @Description 水电工
* @date 2021/11/14
**/
public class WaterElectricWorker {
public void work() {
System.out.println("水电工修水电");
}
}
泥瓦工
/**
* @author 小黑说Java
* @ClassName bricklayer
* @Description 泥瓦工
* @date 2021/11/14
**/
public class Bricklayer {
public void work() {
System.out.println("泥瓦匠贴瓷砖");
}
}
门面
然后我们建立一个门面类,也就是装修公司。
/**
* @author 小黑说Java
* @ClassName DecorationCompany
* @Description 装修公司
* @date 2021/11/14
**/
public class DecorationCompany {
public static void decorate() {
System.out.println("装修公司整合~");
new Designer().design();
new WaterElectricWorker().work();
new Bricklayer().work();
System.out.println("装修完毕");
}
}
在我的同事二狗子就可以来进行装修了,我们来看一下二狗子使用门面和不使用门面的不同实现方式。
public class DecorationTest {
public static void main(String[] args) {
// 不使用门面模式
new Designer().design();
new WaterElectricWorker().work();
new Bricklayer().work();
// 使用门面模式
DecorationCompany.decorate();
}
}
如你所见,使用门面模式可以避免在客户端有大量的实现逻辑,客户端可以更简单清晰的使用服务。
使用门面模式要遵循以下特点。
- 门面设计模式更像是客户端应用程序的助手,它不会对客户端隐藏子系统接口,是否使用门面完全取决于客户端代码;
- 门面设计模式可以应用于开发的任何时刻,通常是在接口数量增加和系统变得复杂时;
- 子系统接口不知道门面,它们不应该有任何对门面接口的引用;
门面模式的优缺点
优点
- 松散耦合: 门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
- 简单易用: 门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。:门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。
缺点
- 当增加子系统时可能带来未知风险;
- 门面不符合开闭原则;
门面模式与代理模式的区别
代理模式侧重于对原对象的访问控制;
代理模式会实现原对象的接口;
代理模式只代理一个接口;
门面模式更侧重于整合子系统资源;
门面模式和子系统对象具有不同的接口抽象;
门面模式代理的是一系列接口。
以上就是门面模式的内容,如果对你有所帮助,点赞是对我最大的鼓励!
转载自:https://juejin.cn/post/7030296401791680542