首先介绍一下迪米特法则(最少知识原则):
一个软件实体应当尽可能少的与其他实体发送相互作用。
外观模式就是迪米特法则的体现,它为系统提供统一的入口。封装子系统的复杂性,便于客户端调用。
用代码来说明:
1.如果有人需要开店,那么他就需要到工商局,税务局,银行,质监局办理各种手续,创建上面的各种类:
public interface 工商局 {
void checkName(); //核名
}
class 海淀区工商局 implements 工商局 {
@Override
public void checkName() {
System.out.println("检查名字是否有冲突!");
}
}
public interface 税务局 {
void taxCertificate(); //办理税务登记证
}
class 海淀税务局 implements 税务局 {
@Override
public void taxCertificate() {
System.out.println("在海淀税务局办理税务登记证!");
}
}
public interface 银行 {
void openAccount(); //开户
}
class 中国工商银行 implements 银行 {
@Override
public void openAccount() {
System.out.println("在中国工商银行开户!");
}
}
public interface 质检局 {
void orgCodeCertificate(); //办理组织机构代码证
}
class 海淀质检局 implements 质检局 {
@Override
public void orgCodeCertificate() {
System.out.println("在海淀区质检局办理组织机构代码证!");
}
}
2.如果在客户端直接调用各个类,那么就会使得客户端与系统之间的耦合度太高,为了降低耦合度,可以实现一个统一的facade供客户端调用:
public class RegisterFacade {
public void register(){
工商局 a = new 海淀区工商局();
a.checkName();
质检局 b = new 海淀质检局();
b.orgCodeCertificate();
税务局 c = new 海淀税务局();
c.taxCertificate();
银行 d = new 中国工商银行();
d.openAccount();
}
}
3.最后,客户端调用代码如下:
public class Client1 {
public static void main(String[] args) {
//不使用外观模式的调用
// 工商局 a = new 海淀区工商局();
// a.checkName();
// 质检局 b = new 海淀质检局();
// b.orgCodeCertificate();
// 税务局 c = new 海淀税务局();
// c.taxCertificate();
// 银行 d = new 中国工商银行();
// d.openAccount();
//使用外观模式
new RegisterFacade().register();
}
}
外观模式在开发中的应用:
JDBC封装后commons提供的DBUtils类;
Hibernate提供的工具类;