⻔⾯模式定义:⻔⾯模式(Facade Pattern)⼜称为外观模式,提供了⼀个统⼀的接⼝,⽤来访问⼦系统中的⼀群接⼝。其主要特征是定义了⼀个⾼层接⼝, 让⼦系统更容易使⽤。
门面模式主要包含2种角色:
外观角色(Facade):也称⻔⾯⻆⾊,系统对外的统⼀接⼝。
**⼦系统⻆⾊(SubSystem):**可以同时有⼀个或多个 SubSystem。每个 SubSytem 都不是⼀个单独的类,
⽽是⼀个类的集合。SubSystem 并不知道 Facade 的存在,对于 SubSystem ⽽⾔, Facade 只是另⼀个
客⼾端⽽已(即 Facade 对 SubSystem 透明)。
门面模式的实现:
场景: 回家, 我们会开各个屋的灯. 离开家时, 会关闭各个屋的灯,如果家⾥设置⼀个总开关, 来控制整个屋的灯就会很⽅便。
我们使⽤⻔⾯模式的实现:
子系统角色中的类:
package com.xiaoyu.captcha.facade;
public class LivingRoomLight implements Light{
@Override
public void on() {
System.out.println("打开客厅灯");
}
@Override
public void off() {
System.out.println("关闭客厅灯");
}
}
package com.xiaoyu.captcha.facade;
public class HallLight implements Light{
@Override
public void on() {
System.out.println("打开走廊灯");
}
@Override
public void off() {
System.out.println("关闭走廊灯");
}
}
package com.xiaoyu.captcha.facade;
public class BedRoomLight implements Light {
@Override
public void on() {
System.out.println("打开卧室灯");
}
@Override
public void off() {
System.out.println("关闭卧室灯");
}
}
门面角色类:
package com.xiaoyu.captcha.facade;
public class LightFacade {
// 门面角色
LivingRoomLight livingRoomLight = new LivingRoomLight();
HallLight hallLight = new HallLight();
BedRoomLight bedRoomLight = new BedRoomLight();
// 打开所有灯
void on() {
livingRoomLight.on();
hallLight.on();
bedRoomLight.on();
}
// 关闭所有灯
void off() {
livingRoomLight.off();
hallLight.off();
bedRoomLight.off();
}
}
客户端角色类:
package com.xiaoyu.captcha.facade;
public class FacadeDemo {
public static void main(String[] args) {
// 客户端角色
// 打开所有的灯
LightFacade lightFacade = new LightFacade();
lightFacade.on();
}
}
一个系统可以有几个门面类?
在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每一个子系统都有一个门面类,整个系统可以有数个门面类。
门面模式的优点:
- 减少了系统的相互依赖。松散了客⼾端与⼦系统的耦合关系, 这使得⼦系统的变化不会影响到调⽤它的客户端;
- 提⾼了灵活性,简化了客⼾端对⼦系统的使⽤难度,客⼾端⽆需关⼼⼦系统的具体实现⽅式,⽽只需要和⻔⾯对象交互即可;
- 提⾼了安全性.。可以灵活设定访问权限, 不在⻔⾯对象中开通⽅法, 就⽆法访问。