1. 定义
为子系统中的一组接口提供了一个统一的界面,Facade模式定义了一个高层接口,这个接口使这个子系统接口更容易使用。
2. 类图
3. 示例
package com.jerry.designpattern;/** * * @author Jerry * @date 2015年1月9日 下午11:44:03 */public interface Stock { /** * 卖出股票 */ void sell(); /** * 买入股票 */ void buy();}package com.jerry.designpattern;/** * * @author Jerry * @date 2015年1月9日 下午11:44:59 */public class StockA implements Stock{ @Override public void sell() { // TODO Auto-generated method stub System.out.println("卖出A股票"); } @Override public void buy() { // TODO Auto-generated method stub System.out.println("买入A股票"); }}package com.jerry.designpattern;/** * * @author Jerry * @date 2015年1月9日 下午11:46:01 */public class StockB implements Stock{ @Override public void sell() { // TODO Auto-generated method stub System.out.println("卖出B股票"); } @Override public void buy() { // TODO Auto-generated method stub System.out.println("买入B股票"); }}package com.jerry.designpattern;/** * * @author Jerry * @date 2015年1月9日 下午11:47:21 */public class StockC implements Stock{ @Override public void sell() { // TODO Auto-generated method stub System.out.println("卖出C股票"); } @Override public void buy() { // TODO Auto-generated method stub System.out.println("买入C股票"); }}package com.jerry.designpattern;/** * 外观类 * 基金管理对应的股票 * @author Jerry * @date 2015年1月9日 下午11:48:58 */public class Fund { private Stock stockA; private Stock stockB; private Stock stockC; public Fund() { stockA = new StockA(); stockB = new StockB(); stockC = new StockC(); } public void sell() { stockA.sell(); stockB.sell(); stockC.sell(); } public void buy() { stockA.buy(); stockB.buy(); stockC.buy(); }}package com.jerry.designpattern;/** * * @author Jerry * @date 2015年1月9日 下午11:51:34 */public class Client { public static void main(String[] args) { Fund fund = new Fund(); fund.buy(); fund.sell(); }}
4. 外观模式目的
外观模式的目的不是给子系统增加的新功能接口,而是为了外部系统减少与子系统多个模块之间的交互,松散耦合,从而使外部系统更简单地使用子系统。
5. 外观模式的优缺点
外观模式的优点有
a. 松散耦合
b. 简单易用
c. 更好的划分访问的层次
外观模式的缺点是过多或者不合理的Facade也容易让人产生疑惑,到底是调Facade接口好,还是直接调用模块好。