Design Pattern
  • GoF设计模式讲解与实现
  • 设计模式一览
  • 创建型设计模式
    • 单例模式
    • 原型模式
    • 简单工厂模式
    • 工厂方法模式
    • 建造者模式
    • 抽象工厂模式
  • 结构型设计模式
    • 代理模式
    • 适配器模式
    • 桥接模式
    • 装饰器模式
    • 外观模式
    • 享元模式
    • 组合模式
  • 行为型设计模式
    • 模板方法模式
    • 策略模式
    • 命令模式
    • 责任链模式
    • 状态模式
    • 观察者模式
    • 中介者模式
    • 迭代器模式
    • 访问者模式
    • 备忘录模式
    • 解释器模式
Powered by GitBook
On this page
  • 模式说明
  • 结构
  • 代码演示
  1. 结构型设计模式

外观模式

模式说明

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

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

结构

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

代码演示

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("买入国债");
    }
}
Previous装饰器模式Next享元模式

Last updated 2 years ago