设计模式---设计模式之外观模式(二)

2014-11-24 10:26:45 · 作者: · 浏览: 1
一组接口提供一个一致的界面,Fa ade模式定了一个高层接口,这个接口使得子系统更加容易使用。如下图

举一个例子吧,先把图贴出来,然后再贴代码

[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接口,那么用于子系统内部的接口功能就不会暴露给子系统的外部了。