門面模式(外觀模式)
阿新 • • 發佈:2017-11-02
package archive 相互調用 int 選擇 oid pub href sta
參考:http://www.cnblogs.com/java-my-life/archive/2012/05/02/2478101.html
/DesignPatterns/src/com/louis/Facade/ModuleA.java
/** * Project Name:DesignPatterns * File Name:ModuleA.java * Package Name:com.louis.Facade * Date:2017年11月2日下午4:17:32 * Copyright (c) 2017, [email protected] All Rights Reserved. **/ package com.louis.Facade; /** * ClassName:ModuleA * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月2日 下午4:17:32 * @author michael * @version * @since JDK 1.7 * @see */ public class ModuleA { //示意方法 public void testA(){ System.out.println("調用ModuleA中的testA方法"); } }
/DesignPatterns/src/com/louis/Facade/ModuleB.java
/** * Project Name:DesignPatterns * File Name:ModuleA.java * Package Name:com.louis.Facade * Date:2017年11月2日下午4:17:32 * Copyright (c) 2017, [email protected] All Rights Reserved. * */ package com.louis.Facade;/** * ClassName:ModuleA * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月2日 下午4:17:32 * @author michael * @version * @since JDK 1.7 * @see */ public class ModuleB { //示意方法 public void testB(){ System.out.println("調用ModuleB中的testB方法"); } }
/DesignPatterns/src/com/louis/Facade/ModuleC.java
/** * Project Name:DesignPatterns * File Name:ModuleA.java * Package Name:com.louis.Facade * Date:2017年11月2日下午4:17:32 * Copyright (c) 2017, [email protected] All Rights Reserved. * */ package com.louis.Facade; /** * ClassName:ModuleA * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月2日 下午4:17:32 * @author michael * @version * @since JDK 1.7 * @see */ public class ModuleC { //示意方法 public void testC(){ System.out.println("調用ModuleC中的testC方法"); } }
/DesignPatterns/src/com/louis/Facade/Facade.java
/** * Project Name:DesignPatterns * File Name:Facade.java * Package Name:com.louis.Facade * Date:2017年11月2日下午4:19:03 * Copyright (c) 2017, [email protected] All Rights Reserved. * */ package com.louis.Facade; /** * ClassName:Facade * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月2日 下午4:19:03 * @author michael * @version * @since JDK 1.7 * @see */ public class Facade { public void test(){ ModuleA a = new ModuleA(); a.testA(); ModuleB b = new ModuleB(); b.testB(); ModuleC c = new ModuleC(); c.testC(); } }
/DesignPatterns/src/com/louis/Facade/Client.java
/** * Project Name:DesignPatterns * File Name:Client.java * Package Name:com.louis.Facade * Date:2017年11月2日下午4:20:14 * Copyright (c) 2017, [email protected] All Rights Reserved. * */ package com.louis.Facade; /** * ClassName:Client * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月2日 下午4:20:14 * @author michael * @version * @since JDK 1.7 * @see */ public class Client { public static void main(String[] args) { Facade facade = new Facade(); facade.test(); } }
使用門面模式還有一個附帶的好處,就是能夠有選擇性地暴露方法。一個模塊中定義的方法可以分成兩部分,一部分是給子系統外部使用的,一部分是子系統內部模塊之間相互調用時使用的。
有了Facade類,那麽用於子系統內部模塊之間相互調用的方法就不用暴露給子系統外部了。
/DesignPatterns/src/com/louis/Facade/ModuleAA.java
/** * Project Name:DesignPatterns * File Name:Module.java * Package Name:com.louis.Facade * Date:2017年11月2日下午4:25:11 * Copyright (c) 2017, [email protected] All Rights Reserved. * */ package com.louis.Facade; /** * ClassName:Module * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月2日 下午4:25:11 * @author michael * @version * @since JDK 1.7 * @see */ public class ModuleAA { /** * 提供給子系統外部使用的方法 */ public void a1(){}; /** * 子系統內部模塊之間相互調用時使用的方法 */ public void a2(){}; public void a3(){}; }
/DesignPatterns/src/com/louis/Facade/ModuleBB.java
/** * Project Name:DesignPatterns * File Name:Module.java * Package Name:com.louis.Facade * Date:2017年11月2日下午4:25:11 * Copyright (c) 2017, [email protected] All Rights Reserved. * */ package com.louis.Facade; /** * ClassName:Module * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月2日 下午4:25:11 * @author michael * @version * @since JDK 1.7 * @see */ public class ModuleBB { /** * 提供給子系統外部使用的方法 */ public void b1(){}; /** * 子系統內部模塊之間相互調用時使用的方法 */ public void b2(){}; public void b3(){}; }
/DesignPatterns/src/com/louis/Facade/ModuleCC.java
/** * Project Name:DesignPatterns * File Name:Module.java * Package Name:com.louis.Facade * Date:2017年11月2日下午4:25:11 * Copyright (c) 2017, [email protected] All Rights Reserved. * */ package com.louis.Facade; /** * ClassName:Module * Function: TODO ADD FUNCTION. * Reason: TODO ADD REASON. * Date: 2017年11月2日 下午4:25:11 * @author michael * @version * @since JDK 1.7 * @see */ public class ModuleCC { /** * 提供給子系統外部使用的方法 */ public void c1(){}; /** * 子系統內部模塊之間相互調用時使用的方法 */ public void c2(){}; public void c3(){}; }
/DesignPatterns/src/com/louis/Facade/ModuleFacade.java
/** * Project Name:DesignPatterns * File Name:ModuleFacade.java * Package Name:com.louis.Facade * Date:2017年11月2日下午4:27:28 * Copyright (c) 2017, [email protected] All Rights Reserved. * */ package com.louis.Facade; /** * ClassName:ModuleFacade Function: TODO ADD FUNCTION. Reason: TODO ADD REASON. * Date: 2017年11月2日 下午4:27:28 * * @author michael * @version * @since JDK 1.7 * @see */ public class ModuleFacade { ModuleAA a = new ModuleAA(); ModuleBB b = new ModuleBB(); ModuleCC c = new ModuleCC(); /** * 下面這些是A、B、C模塊對子系統外部提供的方法 */ public void a1() { a.a1(); } public void b1() { b.b1(); } public void c1() { c.c1(); } }
這樣定義一個ModuleFacade類可以有效地屏蔽內部的細節,免得客戶端去調用Module類時,發現一些不需要它知道的方法。比如a2()和a3()方法就不需要讓客戶端知道,否則既暴露了內部的細節,又讓客戶端迷惑。對客戶端來說,他可能還要去思考a2()、a3()方法用來幹什麽呢?其實a2()和a3()方法是內部模塊之間交互的,原本就不是對子系統外部的,所以幹脆就不要讓客戶端知道。
門面模式在Tomcat中的使用
參考:http://www.cnblogs.com/java-my-life/archive/2012/05/02/2478101.html
門面模式(外觀模式)