学习设计模式之外观模式

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

类结构图
在这里插入图片描述
Facade
外观类,知道哪些子系统类负责处理请求,将 Client的请求代理给适当的子系统对象。
子系统角色
实现具体的功能类,处理 Facade 对象指派的任务,该类中没有 Facade 的任何信息及引用。

代码实现——举个栗子
以炒股为例,一般散户的结构是一个人自己管理股票显得很复杂很累。如果找一个证券基金公司来管理那么就会方便的多,门面类就相当于这个证卷公司。
在这里插入图片描述

public class Stock1 {
    public void sell() {
        System.out.println("股票1卖出...");
    }

    public void buy() {
        System.out.println("股票1买入...");
    }
}

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

    public void buy() {
        System.out.println("股票2买入...");
    }
}

public class Stock3 {
    public void sell() {
        System.out.println("股票3卖出...");
    }

    public void buy() {
        System.out.println("股票3买入...");
    }
}

/**
 * 证券基金管理类
 */
public class Fund {
    private Stock1 stock1;
    private Stock2 stock2;
    private Stock3 stock3;

    public Fund() {
        this.stock1 = new Stock1();
        this.stock2 = new Stock2();
        this.stock3 = new Stock3();
    }

    public void sellFund() {
        this.stock1.sell();
        this.stock2.sell();
        this.stock3.sell();
    }

    public void buyFund() {
        this.stock1.buy();
        this.stock2.buy();
        this.stock3.buy();
    }
}

客户端实现

public class Client {
    public static void main(String[] args) {
        Fund f = new Fund();
        f.buyFund();
        f.sellFund();
    }
}

什么时候使用?

  1. 设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
  2. 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
    在这里插入图片描述
  3. 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

优点

  1. 实现了子系统与客户端之间的松耦合关系。
  2. 客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

缺点

  1. 违背开闭原则 增加新的子系统可能需要修改外观类或客户端,违背了“开闭原则”。
  2. 外观类膨胀 外观类接口膨胀。由于子系统的接口都有外观类统一暴露,使得外观类的API接口过多。
posted @ 2019-02-13 17:12  一定要细心  阅读(126)  评论(0编辑  收藏  举报