GOF之外观模式
外观模式
如果谈起外观模式的话,那么其实应该是最简单的一种模式了。所谓的外观的模式的话,说白了,就是体现了Java
中的一种好的封装性。一种好的封装性就体现了设计模式中的外观模式。更简单的说就是,对外提供的接口就要尽可能的简单。比如说,如果我要喝茶的话,我就要煮开水,又要洗茶具,还要沏茶等,这些步骤是很繁琐的。可是如果有一个服务员的话,那么煮开水,洗茶具,沏茶这些步骤都交给服务员做就好了。如果我要喝茶的话,那么就只需要和服务员
打交道就好了。这样的话,就很简单了。其实,良好的外观模式就体现了良好的封装性。下面我们以一个实际的注册公司的流程为例子。如果我们没有使用外观模式的话,那么我们要做的东西有很多。比如说,我们要跑工商局,还要到银行开户等。
如果使用了外观模式的话,那么就相当于这些活,我都交给一个代理公司做了。我所需要做的就是找一个代理公司做就好了。
我与代理公司打交道就好了。这就是所谓的外观模式。外观模式其实也叫做门面facade;
package com.bjsxt.facade;
public interface 工商局 {
void checkName(); //核名
}
class 海淀区工商局 implements 工商局 {
@Override
public void checkName() {
System.out.println("检查名字是否有冲突!");
}
}
package com.bjsxt.facade;
public interface 税务局 {
void taxCertificate(); //办理税务登记证
}
class 海淀税务局 implements 税务局 {
@Override
public void taxCertificate() {
System.out.println("在海淀税务局办理税务登记证!");
}
}
package com.bjsxt.facade;
public interface 银行 {
void openAccount(); //开户
}
class 中国工商银行 implements 银行 {
@Override
public void openAccount() {
System.out.println("在中国工商银行开户!");
}
}
package com.bjsxt.facade;
public interface 质检局 {
void orgCodeCertificate(); //办理组织机构代码证
}
class 海淀质检局 implements 质检局 {
@Override
public void orgCodeCertificate() {
System.out.println("在海淀区质检局办理组织机构代码证!");
}
}
如果我们不适用外观模式的话,那么我们就需要这样调用。
package com.bjsxt.facade;
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();
}
}
但是如果我们需要使用外观模式的话,那么我们就需要提供一个fecade,也就是需要提供一个门面对象。
package com.bjsxt.facade;
/**
* 办理注册公司流程的门面对象
* @author Administrator
*
*/
public class RegisterFacade {
public void register(){
工商局 a = new 海淀区工商局();
a.checkName();
质检局 b = new 海淀质检局();
b.orgCodeCertificate();
税务局 c = new 海淀税务局();
c.taxCertificate();
银行 d = new 中国工商银行();
d.openAccount();
}
}
如果是这样的话,那么我们的调用就简单了。
package com.bjsxt.facade;
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();
}
}