文章目录
- 外观模式简介
- 结构
- 优缺点
- UML图
- 具体实现
- UML图
- 代码实现
外观模式简介
- 外观模式 (Facade Pattern)也叫门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。
- MyBatis的Configuration配置类,
结构
- 1.外观角色:Facade,为多个子系统对外提供一个共同地接口。
- 2.子系统角色:Sub System,实现系统地部分功能,客户可以通过外观角色访问它。
优缺点
- 优点:该模式对外有一个统一接口,外部不需要关心子系统的具体细节,大大地降低应用程序地复杂度,提高了程序地可维护性。
- 缺点:不符合开闭原则(增加子系统,外观角色也需要修改)
UML图
具体实现
例子:智能家居,遥控器可以一键打开灯光、电视和空调。
UML图
代码实现
- 外观类角色
package com.xxliao.pattern.structure.facade.demo;
/**
* @author xxliao
* @description: 外观角色类
* @date 2024/5/25 14:59
*/
public class ApplicationFacade {
private Light light;
private TV tv;
private AirCondition airCondition;
public ApplicationFacade() {
this.light = new Light();
this.tv = new TV();
this.airCondition = new AirCondition();
}
/**
* @description 一键打开
* @author xxliao
* @date 2024/5/25 15:02
*/
private void on() {
System.out.println("on...");
light.on();
tv.on();
airCondition.on();
}
/**
* @description 一键关闭
* @author xxliao
* @date 2024/5/25 15:02
*/
private void off() {
System.out.println("off...");
light.off();
tv.off();
airCondition.off();
}
/**
* @description 对外提供统一接口
* @author xxliao
* @date 2024/5/25 15:03
*/
public void say(String message) {
if("打开".equals(message)){
on();
}else if("关闭".equals(message)) {
off();
}
}
}
- 子系统角色
package com.xxliao.pattern.structure.facade.demo;
/**
* @author xxliao
* @description: 子系统类 - 空调类
* @date 2024/5/25 14:58
*/
public class AirCondition {
public void on() {
System.out.println("打开了空调...");
}
public void off() {
System.out.println("关闭了空调...");
}
}
package com.xxliao.pattern.structure.facade.demo;
/**
* @author xxliao
* @description: 子系统类 - 灯类
* @date 2024/5/25 14:39
*/
public class Light {
public void on() {
System.out.println("打开了灯...");
}
public void off() {
System.out.println("关闭了灯...");
}
}
package com.xxliao.pattern.structure.facade.demo;
/**
* @author xxliao
* @description: 子系统类 - TV类
* @date 2024/5/25 14:40
*/
public class TV {
public void on() {
System.out.println("打开了电视...");
}
public void off() {
System.out.println("关闭了电视...");
}
}
- 测试客户端
package com.xxliao.pattern.structure.facade.demo;
/**
* @author xxliao
* @description: 外观模式 测试客户端
* @date 2024/5/25 15:04
*/
public class Client {
public static void main(String[] args) {
ApplicationFacade applicationFacade = new ApplicationFacade();
applicationFacade.say("打开");
applicationFacade.say("关闭");
}
}
- 测试结果