本片文章主要介紹外觀模式。 外觀模式:為子系統中一組介面提供一個一致的界面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 我們先看下結構圖: 下麵我們就以這個結構圖寫個簡單的例子: 首先是四個子系統的代碼。 然後是外觀類,它需要瞭解所有的子系統的方法或屬性,進行組合,以備外界調用。 ...
本片文章主要介紹外觀模式。
外觀模式:為子系統中一組介面提供一個一致的界面,此模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
我們先看下結構圖:
下麵我們就以這個結構圖寫個簡單的例子:
首先是四個子系統的代碼。
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 11:02 */ public class SubSystemOne { public void method1() { System.out.println("子系統方法一"); } }
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 11:03 */ public class SubSystemTwo { public void method2() { System.out.println("子系統方法二"); } }
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 11:03 */ public class SubSystemThree { public void method3() { System.out.println("子系統方法三"); } }
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 11:04 */ public class SubSystemFour { public void method4() { System.out.println("子系統方法四"); } }
然後是外觀類,它需要瞭解所有的子系統的方法或屬性,進行組合,以備外界調用。
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: 外觀類 * User: lwx * Date: 2019-03-31 * Time: 11:05 */ public class Facade { private SubSystemOne subSystemOne; private SubSystemTwo subSystemTwo; private SubSystemThree subSystemThree; private SubSystemFour subSystemFour; public Facade() { this.subSystemOne = new SubSystemOne(); this.subSystemTwo = new SubSystemTwo(); this.subSystemThree = new SubSystemThree(); this.subSystemFour = new SubSystemFour(); } public void methodsA() { System.out.println("方法組A"); subSystemOne.method1(); subSystemTwo.method2(); subSystemFour.method4(); } public void methodsB() { System.out.println("方法組B"); subSystemTwo.method2(); subSystemThree.method3(); } }
然後我們看下測試類和運行結果。
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 11:07 */ public class FacadeTest { public static void main(String[] args) { Facade facade = new Facade(); facade.methodsA(); facade.methodsB(); } }
對於面向對象有一定基礎的朋友,即使沒有聽說過外觀模式,也完全有可能在很多時候使用它;比如java web開發的項目中有很多的service和dao,這一層service有一個非常重要的作用,就是為了方便我們管理項目中與業務邏輯相關的事物,service層同時也是組合dao層暴露給controller層或action層的功能;外觀模式還完美地體現了依賴倒轉原則和迪米特法則的思想,所以是非常常用的模式之一。
總結一下外觀模式的優點和缺點:
優點:
1.引入外觀模式可以提供一個簡單的藉口,減少客戶和子系統之間的依賴。
2.在維護一個遺留的大型系統時,可能這個系統已經非常難以維護和擴展了,這時候如果有新系統必需依賴於它就可以為新系統開發一個外觀類,來提供粗糙或高度複雜的遺留代碼的比較清晰的介面,讓新系統與外觀類交互,外觀類與遺留代碼交互所有複雜工作。
缺點:
1.不能很好地限制客戶使用子系統,如果對客戶訪問子系統類做太多限制減少了可變性和靈活性。
2.在不引入外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
最後附上demo的githup地址:https://github.com/yijinqincai/design_patterns
作者:一金芹菜 出處:https://www.cnblogs.com/yijinqincai/ 本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。