标签: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