博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式学习--外观模式

Posted on 2017-10-13 17:38  南国木棉  阅读(108)  评论(0编辑  收藏  举报

外观模式(Facade):为子系统中的一组接口提供一个一直的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式结构图:

案例需求:新股民对股票不熟悉,买基金,基金的专业人士拿新股民的钱去购买股票。

1:创建三个股票类和一个国债类。

package FacadeModel;

/**
 * 股票1
 * @author 我不是张英俊
 *
 */
public class Stock1 {
    
    //卖股票
    public void sell(){
        System.out.println("股票1卖出");
    }
    //买股票
    public void buy(){
        System.out.println("股票1买入");
    }
    
}

package FacadeModel;

public class Stock2 {
    //卖股票
        public void sell(){
            System.out.println("股票2卖出");
        }
        //买股票
        public void buy(){
            System.out.println("股票2买入");
        }
}

package FacadeModel;

public class Stock3 {
    //卖股票
            public void sell(){
                System.out.println("股票3卖出");
            }
            //买股票
            public void buy(){
                System.out.println("股票3买入");
            }
}
package FacadeModel;

/**
 * 国债
 * @author 我不是张英俊
 *
 */
public class NationalDebt1 {
            //卖国债
            public void sell(){
                System.out.println("国债卖出");
            }
            //买国债
            public void buy(){
                System.out.println("国债买入");
            }
}

2:创建基金类。

package FacadeModel;

/**
 * 基金类
 * @author 我不是张英俊
 *
 */
public class Fund {

    Stock1 st1;
    Stock2 st2;
    Stock3 st3;
    
    NationalDebt1 nd;
    
    public Fund(){
        st1=new Stock1();
        st2=new Stock2();
        st3=new Stock3();
        nd=new NationalDebt1();
    }
    
    public void buyFund(){
        st1.buy();
        st2.buy();
        st3.buy();
        nd.buy();
    }
    
    public void sellFund(){
        st1.sell();
        st2.sell();
        st3.sell();
        nd.sell();
    }
    
    
    
}

3:测试类

package FacadeModel;

/**
 * 购买股票,但是因为不熟悉股票,所以购买基金, 通过专业人士操纵基金购买股票,
 * 
 * 外观模式
 * @author 我不是张英俊
 *
 */
public class Test {

    public static void main(String[] args) {
        Fund jijin=new Fund();
        //基金购买
        jijin.buyFund();
        //基金销售
        jijin.sellFund();

    }

}

4:控制台。

股票1买入
股票2买入
股票3买入
国债买入
股票1卖出
股票2卖出
股票3卖出
国债卖出

但是外观模式在什么时候使用那?

首先,在设计系统的初期,应该有意识的将不同的两个层次分离。其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时都会产生很多小类,这本是好事,但是也个外部调用他们的用户程序带来了使用上的困难,增加外观Facade 可以提供一个简单的接口,减少他们之间的依赖。第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但是因为它包含了非常重要的功能,新的需求开发必须要依赖他,此时用外观模式 Facade也是非常合适的。你可以为新的系统开发一个外观Facade类,来提供设计粗糙或者高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。如下图: