外观模式

模式说明

当客户端需要通过调用多个对象各自不同的方法时,可以建立一个持有所有这些对象的外观类,根据客户端对上述多个对象的需要,外观类内有多个方法,这些方法内部调用多个不同对象的方法以满足客户端的不同需求。如此客户端就只需要调用外观类的方法,而无需访问多个对象。例如投资者买股票,投资者是客户端,不同公司的股票形成数量众多的对象。此时投资者可以通过基金经理来间接买股票,基金经理就是外观类,他通过不同的投资策略封装了多个股票的买入和卖出等方法,投资者只需要调用基金经理不同的策略方法即可,无需了解每一支股票。

本示例以上述投资者买股票场景为例,演示外观模式的使用。

结构

外观类: 持有所有子系统的信息,并为客户端提供了一系列访问子系统的方法,这些方法内根据需要调用一个或多个子系统的方法。 子系统类: 可以有多个子系统,每个子系统都有各自的方法。

代码演示

package com.yukiyama.pattern.structure;

/**
 * 外观模式
 */
public class FacadeDemo {

    public static void main(String[] args) {
        // 声明一个外观类
        Fund f = new Fund();
        System.out.println("====执行基金策略1====");
        // 执行既定策略1
        f.strategy1();
        System.out.println("====执行基金策略2====");
        // 执行既定策略2
        f.strategy2();
    }

}

/**
 * 外观类
 * 下例为基金,持有三支股票对象,有两个策略方法,封装对三只股票的不同行为组合。
 */
class Fund{
    private StockApple sa = new StockApple();
    private StockMaotai sm = new StockMaotai();
    private NationalDebt nd = new NationalDebt();
    
    public void strategy1() {
        sa.buy();
        sm.toYuebao();
        nd.sell();
    }
    
    public void strategy2() {
        sa.sell();
        sm.sell();
        nd.buy();
    }
}

/**
 * 子系统类
 * 苹果公司股票
 */
class StockApple{
    public void sell() {
        System.out.println("卖出Apple股票");
    }
    public void buy() {
        System.out.println("买入Apple股票");
    }
}

/**
 * 子系统类
 * 茅台股票
 */
class StockMaotai{
    public void toYuebao() {
        System.out.println("Maotai股票转入余额宝");
    }
    public void sell() {
        System.out.println("买入Maotai股票");
    }
}

/**
 * 子系统类
 * 国债
 */
class NationalDebt{
    public void sell() {
        System.out.println("卖出国债");
    }
    public void buy() {
        System.out.println("买入国债");
    }
}

Last updated