一、什么是外观模式
你家里有各种电器的开关,照明灯开关,家电开关什么的,你平常用用哪个电器就去打开哪个电器的开关。但是你家里也有一个电源总开关,可以控制这些家电的开关使用,这个总共开关便可以理解为这些家电系统的外观模式设计。
二、定义
外观模式是一种使用频率非常高的结构型设计模式,它通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与客户端的耦合度,且客户端调用非常方便。
外观模式的目的不是给予子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统。
外观模式的本质是:封装交互,简化调用。
三、包含角色
Facade(外观角色):为多个子系统对外提供一个共同的接口。
SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;端而已。
四、使用场景
- 为一个复杂的模块或子系统提供一个外界访问的接口
- 子系统相对独立,外界对子系统的访问只要黑箱操作即可
五、优缺点
1、优点
- 减少了系统的相互依赖
- 提高了灵活性。不管系统内部如何变化,只要不影响到外观对象,任你自由活动
- 提高了安全性。想让你访问子系统的哪些业务就开通哪些逻辑,不在外观上开通的方法,你就访问不到
2、缺点
- 不符合开闭原则,修改很麻烦
六、代码结构
package facade;
public class FacadePattern{
public static void main(String[] args)
{
Facade f=new Facade();
f.method();
}
}
//外观角色
class Facade{
private SubSystem01 obj1=new SubSystem01();
private SubSystem02 obj2=new SubSystem02();
//提供对外统一的调用接口
public void method() {
obj1.method1();
obj2.method2();
}
}
//子系统角色
class SubSystem01
{
public void method1() {
//do something
}
}
//子系统角色
class SubSystem02{
public void method2(){
//do something
}
}
七、代码案例
外观角色
package Facade;
/**
* @Package: Facade
* @ClassName: Switch
* @Author: tanp
* @Description: 外观角色,总开关
* @Date: 2020/11/6 11:41
*/
public class Switch {
private TV tv = new TV();
private Light light = new Light();
public void open(){
tv.openTV();
light.openLight();
}
public void close(){
tv.closeTV();
light.closeLight();
}
}
子系统角色
package Facade;
/**
* @Package: Facade
* @ClassName: Light
* @Author: tanp
* @Description: 子系统角色,照明灯的开关
* @Date: 2020/11/6 11:38
*/
public class Light {
public void openLight(){
System.out.println("打开了照明灯");
}
public void closeLight(){
System.out.println("关闭了照明灯");
}
}
package Facade;
/**
* @Package: Facade
* @ClassName: TV
* @Author: tanp
* @Description: 子系统角色 电视机的开关
* @Date: 2020/11/6 11:39
*/
public class TV {
public void openTV(){
System.out.println("打开了电视机");
}
public void closeTV(){
System.out.println("关闭了电视机");
}
}
main
package Facade;
/**
* @Package: Facade
* @ClassName: DemoClient
* @Author: tanp
* @Description: ${description}
* @Date: 2020/11/6 11:44
*/
public class DemoClient {
public static void main(String[] args) {
Switch s = new Switch();
s.open();
s.close();
}
}
运行结果