笨蛋自以为聪明,聪明人才知道自己是笨蛋。 — 莎士比亚
写在前面
外观模式也可以称为门面模式,在我们开发Android的时候,无论是开发SDK还是封装API,大多会用到外观模式。外观模式通过一个外观类使得整个系统的结构只有一个统一的高层接口,这样降低了用户的使用成本。
外观模式的定义:要求一个子系统的外部与内部的通信必须通过一个统一的类进行,此种模式提供了一个高层接口,使得子系统更易于使用。
外观类(Facade):知道那些子系统有负责处理请求,将客户端的请求代理给适当的子系统对象。
子系统类(SubSystem):可以有一个或多个子系统,实现子系统的功能,处理外观类指派的任务,需要注意的是子系统类不含有外观类的引用。
认识外观
下面通过一个例子来认识外观模式:
我要买一双鞋子和一件衣服,但是去实体店的话就要先去鞋店,再去服装店。可是我不想去两个地方,那么我出于懒惰就选择了某宝购物网站,某宝购物网站有许多店铺,这样就能在一个地方买到鞋子又能买到衣服,何乐而不为?
1.子系统类
因为卖鞋子和衣服的是不同的店铺,所以这两个店铺就是两个子系统类。
/**
* 子系统类
*/
public class ShoesSubSystem {
public void buyShoes() {
Log.d("ShoesSubSystem", "购买鞋子!!!");
}
}
/**
* 子系统类
*/
public class ClothesSubSystem {
public void buyClothes() {
Log.d("ClothesSubSystem", "购买衣服!!!");
}
}
2.外观类
某宝购物网站既有卖鞋子的店铺又有卖衣服的店铺,我就可以通过某宝购物网站买到鞋子和衣服,所以某宝购物网站就是外观类。
/**
* 外观类
*/
public class Facade {
private ShoesSubSystem mShoesSubSystem;
private ClothesSubSystem mClothesSubSystem;
public Facade() {
mShoesSubSystem = new ShoesSubSystem();
mClothesSubSystem = new ClothesSubSystem();
}
public void buyShoes() {
mShoesSubSystem.buyShoes();
}
public void buyClothes() {
mClothesSubSystem.buyClothes();
}
}
3.使用
现在创建一个客户端使用外观类,也就是我通过某宝购物网站购买鞋子和衣服。
/**
* 客户端
*/
public class Client {
private Facade mFacade;
public Client() {
// 创建外观类
mFacade = new Facade();
// 购买鞋子
mFacade.buyShoes();
// 购买衣服
mFacade.buyClothes();
}
}
总结
外观模式的优点:
- 减少系统的相互依赖,所有的依赖都是对外观类的依赖,与子系统无关。
- 对用户隐藏子系统的具体实现,减少用户对子系统的耦合。这样即便子系统发生变化,用户也不会感知。
- 加强了安全性,子系统中的方法如果没有在外观类中开通,就无法访问子系统中的方法。
外观模式的缺点:
- 不符合开放封闭原则。如果业务需求出现变更,则可能要直接修改外观类。