外观模式 或称门面模式
Facade Pattern
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
万能读卡器是一个外观模式在生活中的应用。便携存储卡有SD卡、CF卡、TF卡等多种类型,想让电脑支持所有的卡类型,需要预设一排各种各样的接口。使用万能读卡器后,只要设置USB接口就可以了。
如果用代码来描述这一过程,就是标准的外观模式了。
UML图:
代码:
public class CFCard {
public String readCF() {
return "从CF卡读取文件";
}
public void writeCF(String file) {
System.out.println("向CF卡写入文件");
}
}
public class SDCard {
public String readSD() {
return "从SD卡读取文件";
}
public void writeSD(String file) {
System.out.println("向SD卡写入文件");
}
}
public class TFCard {
public String readTF() {
return "从TF卡读取文件";
}
public void writeTF(String file) {
System.out.println("向TF卡写入文件");
}
}
public class UnifiedCardReader {
private SDCard sdCard;
private CFCard cfCard;
private TFCard tfCard;
private int type;
public String read() {
switch (type) {
case 1:
return sdCard.readSD();
case 2:
return cfCard.readCF();
case 3:
return tfCard.readTF();
default:
return "没有插入卡";
}
}
public void write(String file) {
switch (type) {
case 1:
sdCard.writeSD(file);
break;
case 2:
cfCard.writeCF(file);
break;
case 3:
tfCard.writeTF(file);
break;
}
}
public void setSdCard(SDCard sdCard) {
this.sdCard = sdCard;
this.type = 1;
}
public void setCfCard(CFCard cfCard) {
this.cfCard = cfCard;
this.type = 2;
}
public void setTfCard(TFCard tfCard) {
this.tfCard = tfCard;
this.type = 3;
}
public void empty() {
this.sdCard = null;
this.cfCard = null;
this.tfCard = null;
this.type = 0;
}
}
客户端:
public class Client {
public static void main(String[] args) {
UnifiedCardReader unifiedCardReader = new UnifiedCardReader();
unifiedCardReader.setSdCard(new SDCard());
unifiedCardReader.write("some files");
System.out.println(unifiedCardReader.read());
unifiedCardReader.empty();
unifiedCardReader.setCfCard(new CFCard());
unifiedCardReader.write("some files");
System.out.println(unifiedCardReader.read());
}
}
《阿里巴巴Java开发手册》中规定,应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
log4j、logback等日志框架都有各自的API,如果在代码中直接使用,在需要更换日志系统时需要修改各个应用中的各处代码。如果使用SLF4J,则直接更换日志组件即可,不需要修改代码。