简介
Facade模式也叫外观模式,是由GoF提出的23种设计模式种的一种
Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade
类比理解:电影发行公司,他去跟影院谈影片排片时,他会说自己能拍出哪些类型的电影,希望这几部电影排片率高一些,那么影院真正找电影发行公司要电影发行时,电影发行公司提供电影,但是他的电影都是从那些导演那边拿过来给影院放映的。这个小模型中,电影发行公司其实就是导演或者说众多电影的门面,各大影院需要放映找发行公司就可以,而不是一个一个找导演。
再简单一点理解,他就是一类功能的包工头。
结构图
角色和职责
- Facade:为调用方定义简单的调用接口
- Clients:调用者。通过Facade接口调用该提供某些功能的内部类群
- Packages:功能提供者。指提供功能的类群。
实现
功能1
package com.mym.designmodel.facade;
/**
* 职责:Packages:功能提供者。指提供功能的类群。
* 这里是修电灯工人
*/
public class RepairLight {
public void repair(){
System.out.println("修电灯!");
}
}
功能2
package com.mym.designmodel.facade;
/**
* 职责:Packages:功能提供者。指提供功能的类群。
* 这里是修水龙头工人
*/
public class RepairWater {
public void repair(){
System.out.println("修水龙头!");
}
}
外观
package com.mym.designmodel.facade;
/**
* 职责:Facade:为调用方定义简单的调用接口
*/
public class Facade {
private RepairWater repairWater = new RepairWater();
private RepairLight repairLight = new RepairLight();
public void repairWater(){
repairWater.repair();
}
public void repairLight(){
repairLight.repair();
}
public void repairWaterAndLight(){
repairWater.repair();
repairLight.repair();
}
}
客户端clients
package com.mym.designmodel.facade;
/**
* 职责: Clients:调用者。通过Facade接口调用该提供某些功能的内部类群
*/
public class MainClass {
public static void main(String[] args) {
Facade facade = new Facade();
//家里水龙头坏了,让它修水龙头
facade.repairWater();
System.out.println("-----------------");
//家里电灯坏了,让它修电灯
facade.repairLight();
System.out.println("-----------------");
//电灯和水龙头都坏了,两个一起修
facade.repairWaterAndLight();
System.out.println("-----------------");
}
}
执行:
修水龙头!
-----------------
修电灯!
-----------------
修水龙头!
修电灯!
-----------------
外观模式与策略模式对比与选用
- 外观模式让客户端只需要调用方法满足需求。关注的是对外接口外观包装,便捷客户端。他优点在于包装已知功能的对外接口,而缺点就是一旦有新的类似功能就需要改写外观。
- 策略模式使用时,客户端需要知道有哪些算法策略,才能调用。他的关注点在于策略的快速扩展。
选用时应根据扩展能力与便捷性以及客户端的使用便捷来选取