一、定义
<span style="font-size:18px;">为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,为这个接口使得这一子系统更加容易使用。</span>
这定义看了让人好蛋疼。还是来举例说明吧。
二、举例说明
说个离我们的生活比较近的例子就是理财。如果你的钱存放在银行啊,那是最傻的理财方式。每天你的钱获得的利息还不如通货膨胀的点高,也就是100元存银行的话,你的100元每天要贬值几分钱。所以我们要学会理财。我们理财的时候有好多供我们选择的理财渠道或者理财产品,在这呢我就简单的举个例子。股票,基金,期货,外汇,债券等等好多。假如我们自己买的话,要把钱分配一下,每一笔钱分配在不同的理财渠道。我们自己去控制盈亏,风险比较高,当然收益也会比较高。其中比较稳定点的就是买基金,你够买的这支基金的所有钱呢被一个专业的理财团队在操控,这个团队用基金中的钱再去做各个渠道的投资。所以你购买的基金就是一个外观模式。如图
所以外观模式就是:
而非外观模式就是:
有人说不就是把client端就封装了下嘛!确实是封装了下,但是思想一下子就转变了,就更加具有面向对象的,面向接口的编程了。客户端直接与子系统解耦了
三、代码说明
股票:
public abstract class Gupiao {
public abstract void Buy(int money);
}
期货:
public abstract class Qihuo {
public abstract void Buy(int money);
}
外汇:
public abstract class Waihui {
public abstract void Buy(int money);
}
基金:
public abstract class Jjin {
public abstract void buy(int money);
}
具体的的股票:
public class BABAGupiao extends Gupiao {
@Override
public void Buy(int money) {
System.out.println("入股阿里巴巴"+money+"美元");
}
}
具体的期货:
public class BaiyinQihuo extends Qihuo {
@Override
public void Buy(int money) {
// TODO Auto-generated method stub
System.out.println("投资白银期货"+money+"美元");
}
}
具体的外汇:
public class RiYuanWaihui extends Waihui {
@Override
public void Buy(int money) {
// TODO Auto-generated method stub
System.out.println("投资了日元外汇"+money+"美元");
}
}
具体的基金:
public class FuguoJJin extends Jjin {
double totalMoney = 1000000000;
public void operation(){
//买阿里巴巴的吧,最近涨势不错
BABAGupiao baba = new BABAGupiao();
baba.Buy(50000000);
totalMoney -= 50000000;
//炒白银期货
BaiyinQihuo baiyinQihuo = new BaiyinQihuo();
baiyinQihuo.Buy(500000);
totalMoney -= 500000;
//炒日元外汇
RiYuanWaihui riyuanWaihui = new RiYuanWaihui();
riyuanWaihui.Buy(5000000);
totalMoney -= 5000000;
}
@Override
public void buy(int money){
totalMoney+=money;
System.out.println("你购买了富国基金"+money+"元");
}
}
client:
public class Client {
FuguoJJin jijin = new FuguoJJin();
public void test(){
jijin.buy(100000);
jijin.operation();
}
}
类图:
顺序图:
四、总结.
1、外观模式的本质是:封装交互,简化应用。
2、外观模式的优点:
松散耦合
外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
简单易用
外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行 交互,只需要跟外观交互就可以了,相当于外观类为外部客户端使用子系统提供了一站式服务。
更好地划分访问的层次
通过合理的使用Facade,可以帮助我们更好的划分访问的层次。有些方法是对系统外的,有些方法是系统内 部使用的。把需要暴露给外部的功能集中到外观中,这样既能方便客户端使用,也很好地隐藏了内部的细节。
3、外观模式的缺点:
过多的或者是不太合理的Facade也容易让人迷惑。到底用Facade好呢,还是直接调用模块好呢?