《JAVA与模式》第13天―门面模式 (二)

2014-11-24 08:27:06 · 作者: · 浏览: 2
*/
20. public void a2() {
21. };
22.
23. public void a3() {
24. };
25. }


[java]
1. package com.bankht.Facade.SelectiveExposure;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-26 下午04:21:04
6. *
7. * @类说明 :
8. */
9. public class ModuleB {
10. /**
11. * 提供给子系统外部使用的方法
12. */
13. public void b1() {
14. System.out.println("ModuleB.b1()");
15. };
16.
17. /**
18. * 子系统内部模块之间相互调用时使用的方法
19. */
20. public void b2() {
21. };
22.
23. public void b3() {
24. };
25. }


[java]
1. package com.bankht.Facade.SelectiveExposure;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-26 下午04:21:20
6. *
7. * @类说明 :
8. */
9. public class ModuleC {
10. /**
11. * 提供给子系统外部使用的方法
12. */
13. public void c1() {
14. System.out.println("ModuleC.c1()");
15. };
16.
17. /**
18. * 子系统内部模块之间相互调用时使用的方法
19. */
20. public void c2() {
21. };
22.
23. public void c3() {
24. };
25. }


[java]
1. package com.bankht.Facade.SelectiveExposure;
2.
3. /**
4. * @author: 特种兵—AK47
5. * @创建时间:2012-6-26 下午04:21:35
6. *
7. * @类说明 :
8. */
9. public class ModuleFacade {
10.
11. private ModuleA a = new ModuleA();
12. private ModuleB b = new ModuleB();
13. private ModuleC c = new ModuleC();
14.
15. /**
16. * 下面这些是A、B、C模块对子系统外部提供的方法
17. */
18. public void a1() {
19. a.a1();
20. }
21.
22. public void b1() {
23. b.b1();
24. }
25.
26. public void c1() {
27. c.c1();
28. }
29. }

客户端类:
[java]
1. package com.bankht.Facade.SelectiveExposure;
2. /**
3. * @author: 特种兵—AK47
4. * @创建时间:2012-6-26 下午04:24:12
5. *
6. * @类说明 :
7. */
8. public class Client {
9.
10. public static void main(String[] args) {
11. ModuleFacade facade = new ModuleFacade();
12. facade.a1();
13. facade.b1();
14. facade.c1();
15. }
16. }


  这样定义一个ModuleFacade类可以有效地屏蔽内部的细节,免得客户端去调用Module类时,发现一些不需要它知道的方法。比如a2()和a3()方法就不需要让客户端知道,否则既暴露了内部的细节,又让客户端迷惑。对客户端来说,他可能还要去思考a2()、a3()方法用来干什么呢?其实a2()和a3()方法是内部模块之间交互的,原本就不是对子系统外部的,所以干脆就不要让客户端知道。
一个系统可以有几个门面类
  在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每一个子系统都有一个门面类,整个系统可以有数个门面类。
为子系统增加新行为
  初学者往往以为通过继承一个门面类便可在子系统中加入新的行为,这是错误的。门面模式的用意是为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为。比如医院中的接待员并不是医护人员,接待员并不能为病人提供医疗服务。

门面模式的优点
  门面模式的优点:
  ●  松散耦合
  门面模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
  ●  简单易用
  门面模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。
  ●  更好的划分访问层次
  通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。
      
________________________________________

门面模式在Tomcat中的使用
  Tomcat中门面模式使用的很多,因为Tomcat中有很多不同组件,每个组件要相互通信,但是又不能将自己内部数据过多的暴露给其他组件。用门面模式隔离数据是个很好的方法。
  下面是Request上使用的门面模式:

  使用过Servlet的人都清楚,除了要在web.xml做相应的配置外,还需继承一个叫HttpServlet的抽象类,并且重写doGet与doPost方法(当然只重写service方法也是可以的)。
[java]
1. public class TestServlet extends HttpServlet {
2.
3. public void doGet(HttpServletRequest request, HttpServletResponse response)
4. throws ServletException, IOException {
5.
6. this.doPost(request, response);
7.
8. }
9.
10. public void do