1 外观模式介绍
外观模式是一种结构型设计模式,用于简化大型代码库中的复杂子系统。
它通过提供一个高层级的接口,使得客户端可以更容易地使用子系统的功能,同时也避免了直接与复杂子系统接口交互所带来的复杂性和不可维护性。在外观模式中,客户端和子系统之间的交互都通过一个外观对象进行,这个对象相当于客户端与子系统之间的中介者。
📌 场景
-
当一个复杂的系统有多个子系统组成时,可以使用外观模式将它们封装起来,降低耦合度,提高系统的可维护性和扩展性。
-
当系统需要支持多个不同的客户端访问时,可以使用不同的外观类来提供不同的接口,满足各个客户端的需求。
-
当系统需要逐步演化,从而变得更加复杂时,外观模式可以帮助我们逐步将复杂性隐藏起来,保证系统的稳定性和可维护性。
📌 优缺点
- 优点:简化接口、提高灵活性、提高安全性
- 缺点:不符合开闭原则、难以单元测试、难以单元测试
2 外观模式实现
以找各个部门办理业务为例:
📌 1.定义A部门
/**
* A部门
*/
public class DeptA {
/**
* 办理业务
*/
public void business() {
System.out.println("A部门办理了业务");
}
}
📌 2.定义B部门
/**
* B部门
*/
public class DepartmentB {
/**
* 办理业务
*/
public void business() {
System.out.println("B部门办理了业务");
}
}
📌 3.定义C部门
/**
* C部门
*/
public class DepartmentC {
/**
* 办理业务
*/
public void business() {
System.out.println("C部门办理了业务");
}
}
📌 4.定义外观部门
/**
* 外观部门
*/
public class Facade {
/**
* A部门
*/
private DeptA deptA;
/**
* B部门
*/
private DeptB deptB;
/**
* C部门
*/
private DeptC deptC;
/**
* 无参构造器中给包装的部门赋值
*/
public Facade() {
deptA = new DeptA();
deptB = new DeptB();
deptC = new DeptC();
}
/**
* 办理业务
*/
public void business() {
deptA.business();
deptB.business();
deptC.business();
}
}
📌 5.调用
// 找到外观部门
Facade facade = new Facade();
// 办理业务
facade.business();
控制台输出:
如此即实现了找一个部门就办理了多个部门的业务。不管多复杂的业务,麻烦的都是外观部门,而不是办理业务的人。哪个部门的业务发生变化了,外观部门去跟它们沟通协调做相应调整就行,办理业务的人不用再熟悉调整后的业务,还像往常一样找外观部门办理即可。