今天学习了外观模式,给我第一感觉就是。。。。没感觉,之后自己做demo的时候才发现,自己学完之后没有感觉就是因为平时用的太多了,以前没有模式的概念,自然不往这个方面去想,现在学完之后,发现自己很早之前就会了,所以就没什么感觉。。
好,言归正传,所谓的外观模式,主要目的我感觉就是解耦,比如我们有三个不同的类,客户需要完成的工作需要这三个类来一起完成,怎么办呢?把这三个类暴露给客户么?那样的话,耦合度就太高了,那么怎么才能使他们之间耦合减少呢?那就是使用外观模式,外观模式通过给外界(或者客户)暴露一个统一的类,来完成固定的工作,在这期间,客户无需知道细节,只要调用这个类的这个方法,最后得到结果即可。
我感觉我说了这么多,大家还是可能不太明白,那么我就用一个例子来说明一下(这个例子用的不太好,写的比较匆忙,还请见谅)
我们每个人都去饭店吃过饭,我们进饭店之后,拿起菜单点菜比如要点一碗米饭,按照正常的逻辑,我们会在意这个大米是东北产的还是海南产的么?(大家不要较真,说的是这个意思),我们甚至什么都不关心,反正最后服务员把米饭端上来,我们吃,就够了。同样的,蔬菜,鱼,都是这样。如果我们吃的每一样东西都要知道这个东西生产制作的细节,那么吃顿饭会把我们累死。。。
我们先看一下包结构
下边是代码
package com.facade.sub;
/**
* 米饭类,在整个系统中充当子系统的角色
* @author ZHENGWEI
* @date Jul 25, 2015
*/
public class Rice {
public void zheJiang(){
System.out.println("这是浙江生产的大米");
}
public void jiangSu(){
System.out.println("这是江苏生产的大米");
}
public void doRice(){
System.out.println("把大米做成米饭");
}
}
package com.facade.sub;
/**
* 鱼类,作用也是充当子系统,与米饭类平级
* @author ZHENGWEI
* @date Jul 25, 2015
*/
public class Fish {
public void hangZhou(){
System.out.println("这是杭州的鱼");
}
public void doFish(){
System.out.println("把鱼炖熟了");
}
}
package com.facade.sub;
/**
* 蔬菜类,与之前两个类一样
* @author ZHENGWEI
* @date Jul 25, 2015
*/
public class Vegetables {
public void doVeg(){
System.out.println("鱼香肉丝");
}
public void doVeg1(){
System.out.println("木须肉");
}
}
好,我们写完了这三个类,如果我们点菜的时候,要直接new 这几个类,那么我们还有了解他们的细节,太麻烦了。所以Facade就充当了菜单的角色
package com.facade.facade;
import com.facade.sub.Fish;
import com.facade.sub.Rice;
import com.facade.sub.Vegetables;
/**
* 吃饭类,吃饭的选择有多种,在此做统一的调用
* @author ZHENGWEI
* @date Jul 25, 2015
*/
public class EatFacade {
/**
* 我们吃饭的时候,并不关心米饭是哪里生产的,鱼是哪里的
* 我们最终的目的就是吃掉它
*/
private Rice rice;
private Fish fish;
private Vegetables veg;
public EatFacade(){
this.rice = new Rice();
this.fish = new Fish();
this.veg = new Vegetables();
}
public void riceAndFish(){
rice.zheJiang();
rice.doRice();
fish.hangZhou();
fish.doFish();
}
public void riceAndVeg(){
rice.zheJiang();
rice.doRice();
veg.doVeg();
}
public void riceAndVeg1(){
rice.zheJiang();
rice.doRice();
veg.doVeg1();
}
}
最后是测试类
package com.facade.main;
import com.facade.facade.EatFacade;
public class FacadeMain {
public static void main(String[] args) {
EatFacade eatFacade = new EatFacade();
eatFacade.riceAndFish();
System.out.println("===============================");
eatFacade.riceAndVeg();
System.out.println("===============================");
eatFacade.riceAndVeg1();
System.out.println("===============================");
}
}
也就是说,我们吃饭的时候,只要看菜单就可以了,剩下的事情是出事要做的事情,我们等着吃就ok了。所以,客户只需要与菜单发生耦合,而不必与具体的某个事物发生关系。
最后的结果:
最后,引用其他博客上的几句话,这是我在学习过程中看到的,希望对大家有帮助:
1、外观模式为复杂子系统提供了一个简单接口,并不为子系统添加新的功能和行为。
2、外观模式实现了子系统与客户之间的松耦合关系。
3、外观模式没有封装子系统的类,只是提供了简单的接口。 如果应用需要,它并不限制客户使用子系统类。因此可以再系统易用性与通用性之间选择。