标签:sign 组合 facade lan 封装 用例 ade 地址 esc
/**
* @Description A模块
* @author jerry
* @date 2016年4月11日下午2:16:04
*/
public interface AModuleApi {
public void a1(); //此方法主要用于外部调用
public void a2(); //下面双方法主要用于子系统内部间调用
public void a3();
}
/**
* @Description A模块实现
* @author jerry
* @date 2016年4月11日下午2:17:10
*/
public class AModuleImpl implements AModuleApi {
@Override
public void a1() {
System.out.println("调用了A模块");
}
@Override
public void a2() {
//TODO 主要用于子模块间互相调用
}
@Override
public void a3() {
//TODO 主要用于子模块间互相调用
}
}/**
* @Description B模块
* @author jerry
* @date 2016年4月11日下午2:16:12
*/
public interface BModuleApi {
public void b1(); //此方法主要用于外部调用
public void b2(); //下面双方法主要用于子系统内部间调用
public void b3();
}
/**
* @Description B模块实现
* @author jerry
* @date 2016年4月11日下午2:17:10
*/
public class BModuleImpl implements BModuleApi {
@Override
public void b1() {
System.out.println("调用了B模块");
}
@Override
public void b2() {
//TODO 主要用于子模块间互相调用
}
@Override
public void b3() {
//TODO 主要用于子模块间互相调用
}
}
同理。C模块也是如此,篇幅原因。这里不贴代码了,须要代码能够从我github下clone,文末会给出地址。public class Client {
public static void main(String[] args) {
AModuleApi a = new AModuleImpl();
a.a1();
BModuleApi b = new BModuleImpl();
b.b1();
CModuleApi c = new CModuleImpl();
c.c1();
}
}
相信非常easy能够写出这种代码。细致想想能够发现,假设这样写。会存在例如以下问题:
/**
* @Description 外观类,通常设计成单例
* @author jerry
* @date 2016年4月11日下午2:43:26
*/
public class Facade {
private Facade(){}
public static void test(){
AModuleApi a = new AModuleImpl();
a.a1();
BModuleApi b = new BModuleImpl();
b.b1();
CModuleApi c = new CModuleImpl();
c.c1();
}
}public class Client {
public static void main(String[] args) {
// AModuleApi a = new AModuleImpl();
// a.a1();
// BModuleApi b = new BModuleImpl();
// b.b1();
// CModuleApi c = new CModuleImpl();
// c.c1();
Facade.test();
}
}
这样一来。client仅仅要与外观类打交道就可以,从而更好地实现了client和子系统各模块的耦合性。public interface FacadeApi {
public void a1();
public void b1();
public void c1();
/**
* @Description 原有方法,将各模块方法组合调用
* @return void
* @throws
*/
public void test();
}
/**
* @Description 外观接口实现
* @author jerry
* @date 2016年4月11日下午3:19:25
*/
public class FacadeImpl implements FacadeApi {
@Override
public void a1() {
new AModuleImpl().a1();
}
@Override
public void b1() {
new BModuleImpl().b1();
}
@Override
public void c1() {
new CModuleImpl().c1();
}
@Override
public void test() {
a1();
b1();
c1();
}
}/**
* @Description 外观接口实现
* @author jerry
* @date 2016年4月11日下午3:19:25
*/
public class FacadeImpl implements FacadeApi {
@Override
public void a1() {
new AModuleImpl().a1();
}
@Override
public void b1() {
new BModuleImpl().b1();
}
@Override
public void c1() {
new CModuleImpl().c1();
}
@Override
public void test() {
a1();
b1();
c1();
}
}public class Client {
public static void main(String[] args) {
// AModuleApi a = new AModuleImpl();
// a.a1();
// BModuleApi b = new BModuleImpl();
// b.b1();
// CModuleApi c = new CModuleImpl();
// c.c1();
// Facade.test();
FacadeApi api = Factory.createFacade();
api.test();
}
}
这样以后,就对client降低了模块内部方法的暴露。【JAVA设计模式】外观模式(Facade Pattern)
标签:sign 组合 facade lan 封装 用例 ade 地址 esc
原文地址:http://www.cnblogs.com/yangykaifa/p/7290448.html