为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,隐藏系统的复杂性。
角色
外观(Facade):为多个子系统对外提供一个共同的接口
子系统(Sub-System):实现系统的部分功能,客户可以通过外观角色访问它
客户(Client):通过一个外观角色访问各个子系统的功能
子系统 SubSystem
public class SubSystem {
private String name;
public SubSystem(String name) {
this.name = name;
}
public void start() {
System.out.println("start " + name);
}
public void stop() {
System.out.println("stop " + name);
}
}
外观 Facade
import java.util.ArrayList;
import java.util.List;
public class Facade {
List<SubSystem> subSyss;
public Facade(String ... subSysNames) {
subSyss = new ArrayList<>(subSysNames.length);
for (String subSysName : subSysNames) {
subSyss.add(new SubSystem(subSysName));
}
}
public void start() {
for (SubSystem subSys : subSyss) {
subSys.start();
}
}
public void stop() {
for (SubSystem subSys : subSyss) {
subSys.stop();
}
}
}
客户 Client
public class Client {
public static void main(String args[]) {
Facade facade = new Facade("SubSys#1", "SubSys#2", "SubSys#3");
facade.start();
facade.stop();
}
}
举例
电脑的启动和关机需要各个部件:CPU、主板、RAM、电源、硬盘的分工合作,将这些操作通过门面模式封装到启动和关机操作中
子系统 Power / MainBoard / HardDisk / Ram / Cpu / GraphicsCard
public class Power {
public void supply() {
System.out.println("Power supply...");
}
public void cutOff() {
System.out.println("Cut off power");
}
}
public class MainBoard {
public void boot() {
System.out.println("Mainboard boot...");
}
public void stop() {
System.out.println("Stop mainboard...");
}
}
public class HardDisk {
public void read() {
System.out.println("Read data...");
}
public void save() {
System.out.println("Save data...");
}
}
public class Ram {
public void load() {
System.out.println("Load data...");
}
public void clear() {
System.out.println("Clear data...");
}
}
public class Cpu {
public void execute(String command) {
System.out.println("Execute " + command + " command...");
}
}
public class GraphicsCard {
public void display() {
System.out.println("Display desktop");
}
public void stop() {
System.out.println("Stop display");
}
}
外观 ComputerFacade
public class ComputerFacade {
private Power power;
private MainBoard mainBoard;
private HardDisk hardDisk;
private Ram ram;
private Cpu cpu;
private GraphicsCard graphicsCard;
public ComputerFacade() {
power = new Power();
mainBoard = new MainBoard();
hardDisk = new HardDisk();
ram = new Ram();
cpu = new Cpu();
graphicsCard = new GraphicsCard();
}
public void start() {
power.supply();
mainBoard.boot();
hardDisk.read();
ram.load();
cpu.execute("start");
graphicsCard.display();
}
public void stop() {
cpu.execute("shutdown");
ram.clear();
hardDisk.save();
graphicsCard.stop();
mainBoard.stop();
power.cutOff();
}
}
测试类
public class ComputerFacadeTester {
public static void main(String args[]) {
ComputerFacade facade = new ComputerFacade();
facade.start();
facade.stop();
}
}