举一个例子吧,先把图贴出来,然后再贴代码
[java]
package demo02.facade01;
/**
* A模块的接口
*/
public interface AModuleApi {
/**
* 示意方法,A模块对外的一个功能方法
*/
public void testA();
}
[java]
package demo02.facade01;
public class AModuleImpl implements AModuleApi {
public void testA() {
System.out.println("现在在A模块里面操作testA方法");
}
}
[java]
package demo02.facade01;
public interface BModuleApi {
public void testB();
}
[java]
package demo02.facade01;
public class BModuleImpl implements BModuleApi {
public void testB() {
System.out.println("现在在B模块里面操作testB方法");
}
}
[java] www.2cto.com
package demo02.facade01;
public interface CModuleApi {
public void testC();
}
[java]
package demo02.facade01;
public class CModuleImpl implements CModuleApi {
public void testC() {
System.out.println("现在在C模块里面操作testC方法");
}
}
[java]
package demo02.facade01;
/**
* 外观对象
*/
public class Facade {
/**
* 示意方法,满足客户需要的功能
*/
public void test() {
// 在内部实现的时候,可能会调用到内部的多个模块
AModuleApi a = new AModuleImpl();
a.testA();
BModuleApi b = new BModuleImpl();
b.testB();
CModuleApi c = new CModuleImpl();
c.testC();
}
}
[java]
package demo02.facade01;
public class Client {
public static void main(String[] args) {
// 不用Facade,需要自己跟多个模块交互
// AModuleApi a = new AModuleImpl();
// a.testA();
// BModuleApi b = new BModuleImpl();
// b.testB();
// CModuleApi c = new CModuleImpl();
// c.testC();
//
// System.out.println("使用Facade----------------------〉");
// 使用了Facade
new Facade().test();
}
}
至此,代码完全贴上。
第四:外观模式的本质:封装交互,简化调用。
它体现了“最少知识原则”
第五:外观模式的优缺点
优点:松散耦合,简单易用,更好的划分访问的层次
缺点:过多的或者不合理的facade也容易让人迷惑.
第六:何时选用外观模式
如果希望为一个复杂的子系统提供一个简单接口的时候,从而简化客户端的应用
如果希望客户端程序和抽象类实现松散耦合,可以考虑使用外观模式
如果构建多层结构的系统,可以松散各层结构之间的依赖关系。
第七:facade成为接口以后,有一个好处就是可以选择性的暴露接口,但是如何避免接口污染呢,请看范例
[java]
package cn.javass.dp.facade.example4;
public interface AModuleApi {
public void a1();
public void a2();
public void a3();
}
[java]
package cn.javass.dp.facade.example4;
public interface BModuleApi {
//对子系统外部
public void b1();
//子系统内部使用
public void b2();
//子系统内部使用
public void b3();
}
[java]
package cn.javass.dp.facade.example4;
public interface CModuleApi {
//对子系统外部
public void c1();
//子系统内部使用
public void c2();
//子系统内部使用
public void c3();
}
[java]
package cn.javass.dp.facade.example4;
public interface FacadeApi {
public void a1();
public void b1();
public void c1();
public void test();//对外提供的组合方法,同前面Facade类的方法一样
}
这样的话,一个模块中的接口定义分为两部分,一部分是给子系统外部使用的【例如a1()】,一部分是给子系统内部的模块之间的相互调用使用的【例如a2(),a3()】,有了facade接口,那么用于子系统内部的接口功能就不会暴露给子系统的外部了。