外观模式小试
一、介绍:
引用《研磨设计模式》中的定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这一接口使得这一子系统更易于使用。
外观模式的本质是——封装交互、简化调用。
什么意思呢?外观模式封装交互的目的,就是简化调用。说白了,就是要讲各个模块之间复杂的交互,放到外观类的某些方法中。然后在外观类中选择性的将某些方法暴露给外部去调用。这样一来,对于外部而言,调用功能就非常简单了,而且还隐藏了各个模块的实现细节。
二、结构
1、Facade——对外的高层接口。
2、Client——调用者
3、ModelApiX——模块接口
4、ModelApiXImpl——模块接口实现类
三、我的实现
1、我们有这样3个模块A、B、C,对应接口如下:
package facade; public interface InterfaceA { public void a1(); public void a2(); }
package facade; public interface InterfaceB { public void b1(); public void b2(); }
package facade; public interface InterfaceC { public void c1(); public void c2(); }
2、有对应3个实现类,如下:
package facade; public class ImplA implements InterfaceA { @Override public void a1() { // TODO Auto-generated method stub System.out.println("al"); } @Override public void a2() { // TODO Auto-generated method stub System.out.println("a2"); } }
package facade; public class ImplB implements InterfaceB { @Override public void b1() { // TODO Auto-generated method stub System.out.println("b1"); } @Override public void b2() { // TODO Auto-generated method stub System.out.println("b2"); } }
package facade; public class ImplC implements InterfaceC{ @Override public void c1() { // TODO Auto-generated method stub System.out.println("c1"); } @Override public void c2() { // TODO Auto-generated method stub System.out.println("c2"); } }
3、模块A、B、C,中有一部分方法是打算暴露给调用者,有一部分则打算隐蔽。
为此我们定义一个外观接口:
package facade; public interface FacadeInterface { public void a1(); public void b1(); public void c1(); public void test(); }
一个实现类,如下:
package facade; public class Facade implements FacadeInterface { InterfaceA a = new ImplA(); InterfaceB b = new ImplB(); InterfaceC c = new ImplC(); @Override public void a1() { // TODO Auto-generated method stub a.a1(); } @Override public void b1() { // TODO Auto-generated method stub b.b1(); } @Override public void c1() { // TODO Auto-generated method stub c.c1(); } @Override public void test() { // TODO Auto-generated method stub a.a2(); b.b2(); c.c2(); } }
于是,由于组件之间的组合在外观实现类中已经组合完毕,因此,客户端调用时,便相当简单,如下:
package facade; public class client { public static void main(String[] args) { FacadeInterface facade = new Facade(); facade.test(); } }
/**
* ————————如果觉得本博文还行,别忘了推荐一下哦,谢谢!
* 作者:钱书康
* 欢迎转载,请保留此段声明。
* 出处:http://www.cnblogs.com/zrtqsk/
*/
* ————————如果觉得本博文还行,别忘了推荐一下哦,谢谢!
* 作者:钱书康
* 欢迎转载,请保留此段声明。
* 出处:http://www.cnblogs.com/zrtqsk/
*/