模式说明
当客户端需要通过调用多个对象各自不同的方法时,可以建立一个持有所有这些对象的外观类,根据客户端对上述多个对象的需要,外观类内有多个方法,这些方法内部调用多个不同对象的方法以满足客户端的不同需求。如此客户端就只需要调用外观类的方法,而无需访问多个对象。例如投资者买股票,投资者是客户端,不同公司的股票形成数量众多的对象。此时投资者可以通过基金经理来间接买股票,基金经理就是外观类,他通过不同的投资策略封装了多个股票的买入和卖出等方法,投资者只需要调用基金经理不同的策略方法即可,无需了解每一支股票。
本示例以上述投资者买股票场景为例,演示外观模式的使用。
结构
外观类
持有所有子系统的信息,并为客户端提供了一系列访问子系统的方法,这些方法内根据需要调用一个或多个子系统的方法。
子系统类
可以有多个子系统,每个子系统都有各自的方法。
代码演示
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("买入国债");
}
}