facade外观模式
通过买股票与通过基金买股票引出外观模式:
package com.disign.facade; /** * Created by zhen on 2017-05-18. */ public class TestStock { public void run1(){ Stock1 gu1 = new Stock1(); Stock2 gu2 = new Stock2(); Stock3 gu3 = new Stock3(); gu1.buy(); gu2.buy(); gu3.buy(); gu1.sell(); gu2.sell(); gu3.sell(); } public void run2(){ Fund fund = new Fund(); fund.buyFund(); fund.sellFund(); } } interface transaction{ public void sell(); public void buy(); } class Stock1 implements transaction{ public void sell(){ } public void buy(){ } } class Stock2 implements transaction{ public void sell(){ } public void buy(){ } } class Stock3 implements transaction{ public void sell(){ } public void buy(){ } } class Fund{ Stock1 gu1; Stock2 gu2; Stock3 gu3; public void Fund(){ gu1 = new Stock1(); gu2 = new Stock2(); gu3 = new Stock3(); } public void buyFund(){ gu1.buy(); gu2.buy(); gu3.buy(); } public void sellFund(){ gu1.sell(); gu2.sell(); gu3.sell(); } }
外观模式Facade,为系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这一接口使得这一子接口更加容易使用
package com.disign.facade; /** * Created by zhen on 2017-05-18. */ public class TestFacade { public static void main(String[] args){ Facade facade = new Facade(); facade.methodA(); facade.methodB(); } } class SubSystemOne{ public void methodOne(){ } } class SubSystemTwo{ public void methodTwo(){ } } class SubSystemThree{ public void methodThree(){ } } class SubSystemFour{ public void methodFour(){ } } class Facade{ SubSystemOne one; SubSystemTwo two; SubSystemThree three; SubSystemFour four; public Facade(){ this.one = new SubSystemOne(); this.two = new SubSystemTwo(); this.three = new SubSystemThree(); this.four = new SubSystemFour(); } public void methodA(){ System.out.println("方法组A()"); one.methodOne(); two.methodTwo(); four.methodFour(); } public void methodB(){ System.out.println("方法组B()"); two.methodTwo(); three.methodThree(); } }
何时使用外观模式?
首先,在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立外观Facade。
其次,在开发阶段,子系统往往应为不断的重构演化而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖
在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和拓展了,此时使用外观也是非常合适的。为新系统开发一个外观Facade类,提供遗留代码的额比较清晰的简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。