思考外观模式
正常完成一个功能需要调很多个接口,外观模式就是组装这些接口为一个接口,对外提供这一个接口,用户调用这一个接口就能完成原来多个接口才能完成的功能,让客户端与子系统之间实现了解耦,简化调用
1.外观模式的本质
外观模式的本质是:封装交互,简化调用。
门面模式的本质是提供一个统一的接口,封装一组复杂的子系统或组件,使其对客户端呈现出一个简单的界面。它通过引入一个门面类(Facade Class)作为客户端与子系统之间的中间层,将客户端的请求委派给相应的子系统进行处理。
门面模式的本质是通过封装复杂性,隐藏系统的内部复杂结构和实现细节,提供一个简单易用的接口给客户端。它在设计上追求简单性和易用性,使得客户端能够更加方便地使用系统的功能,同时实现了客户端与子系统之间的松耦合关系。
门面模式的关键是门面类,它充当了一个入口点的角色。门面类封装了一系列子系统的功能,负责协调子系统的交互,并提供一个高层次的接口给客户端使用。客户端只需与门面类进行交互,而无需直接与子系统进行交互,从而降低了客户端的复杂性。
通过使用门面模式,可以实现系统的简化、松耦合、封装复杂性和支持分层架构等优点。它是一种结构型设计模式,常用于大型系统或复杂的软件系统中,以提供更好的可维护性、可扩展性和易用性。
2.何时选用外观模式
建议在如下情况时选用外观模式。
-
当需要为复杂的子系统提供一个简单易用的接口,以方便客户端进行操作时,门面模式非常有用。门面类可以封装一系列复杂的操作,将其转化为简单的接口方法,使得客户端能够更加方便地使用子系统的功能。
-
当需要构建分层架构的系统时,门面模式可以用于定义每个层级的接口。每个层级可以有一个门面类,用于与上一层级进行交互,并隐藏下一层级的细节。这样可以有效地划分系统的职责,提高系统的可维护性和可扩展性。
总而言之,门面模式适用于需要简化复杂系统、实现松耦合、提供简单接口或支持分层架构的情况。它可以将复杂性封装起来,提供一个简单统一的接口,使得系统更易用、更灵活。
3.优缺点
外观模式有如下优点。
-
提供简单接口
当需要为复杂的子系统提供一个简单易用的接口,以方便客户端进行操作时,门面模式非常有用。门面类可以封装一系列复杂的操作,将其转化为简单的接口方法,使得客户端能够更加方便地使用子系统的功能。 -
支持分层架构
当需要构建分层架构的系统时,门面模式可以用于定义每个层级的接口。每个层级可以有一个门面类,用于与上一层级进行交互,并隐藏下一层级的细节。这样可以有效地划分系统的职责,提高系统的可维护性和可扩展性。
外观模式有如下缺点。
-
增加了一个额外的抽象层
引入门面类会增加系统的复杂性,因为需要额外的抽象层来封装子系统的功能。这可能会导致一定的性能损失,特别是在对性能要求较高的系统中。 -
不适合过于简单的系统
如果系统本身非常简单,并且不存在复杂的子系统或组件,使用门面模式可能会引入不必要的复杂性。在这种情况下,直接与系统进行交互可能更加简单和高效。
4.外观模式的结构
5.实现
模拟代码生成使用的外观模式
public class ControllerGenerate {
public void generate(){
System.out.println("controller层代码生成");
}
}
public class ServiceGenerate {
public void generate(){
System.out.println("service层代码生成");
}
}
public class DaoGenerate {
public void generate(){
System.out.println("dao层代码生成");
}
}
门面类
public class Facade {
//组装各个方法
public static void generate(){
ControllerGenerate controllerGenerate = new ControllerGenerate();
ServiceGenerate serviceGenerate = new ServiceGenerate();
DaoGenerate daoGenerate = new DaoGenerate();
controllerGenerate.generate();
serviceGenerate.generate();
daoGenerate.generate();
}
}
测试
public class FacadeTest {
/**
* 模拟代码生成过程
* 1.生成controller层
* 2.生成service层
* 3.生成dao层
* @param args
*/
public static void main(String[] args) {
ControllerGenerate controllerGenerate = new ControllerGenerate();
ServiceGenerate serviceGenerate = new ServiceGenerate();
DaoGenerate daoGenerate = new DaoGenerate();
controllerGenerate.generate();
serviceGenerate.generate();
daoGenerate.generate();
System.out.println("--------------------------------");
Facade.generate();
}
}