外观模式(Facade pattern),是软件工程中常用的一种软件设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。----WIKIPEDIA
当一个项目中出现比较杂乱的调用关系时,类与类之间的耦合关系过于复杂,为了降低耦合度,我们可以采用一个公共的接口与其他类发生耦合,这样可以尽量大的降低外界与该系统的耦合度,同时降低了整个系统的复杂度,外观模式相当于一个公共的入口一样,为使用者敞开大门,暴漏一些必要的接口,方便外界进行调用。通俗来讲就是,有多个不同的类提供了多个访问的接口,外观模式就是要统一将这些接口进行管理。如下面两个图所示。
使用外观模式:
假设这样一个情景:我想做个红烧肉,说下主要的调料需要买:五花肉、油等等,这个不是重点,说一下里面有什么类吧,五花肉的零售商、食材批发商、油的零售商,先拿这三个举例子。三者之间的关系,零售商需要向批发商购置自己需要配备的食材。而我呢,作为一个使用者,只需要去零售商那里去购置即可。
其中Facade中代码为
public class Facade { private OilRetailer oilRetailer = new OilRetailer(); private PorkRetailer porkRetailer = new PorkRetailer(); /** * 买猪肉 * @return */ public String getPork(){ System.out.println(porkRetailer.getPork()); return "Pork"; } /** * 买油 * @return */ public String getOil(){ System.out.println(oilRetailer.getOil()); return "Oil"; } }猪肉零售商
public class PorkRetailer { private WholeSaler wholeSaler = new WholeSaler(); public String getPork(){ System.out.println(wholeSaler.getProk()); return "PorkRetailer-Pork"; } }油零售商
public class OilRetailer { private WholeSaler wholeSaler = new WholeSaler(); public String getOil(){ System.out.println(wholeSaler.getOil()); return "OilRetailer-Oil"; } }
public class WholeSaler { public String getProk(){ return "WholeSaler-Prok"; } public String getOil(){ return "WholeSaler-Oil"; } }
观察上述类,因为不管是批发商还是零售商,他们的方法基本上一致,那么,我们可以考虑优化一下,通过接口进行进一步的优化。
引入接口,如果使用过Spring框架的朋友知道可以通过Spring的依赖注入功能实现对象的注入,那么在这种情况下,将大大的减少类与类直接的耦合。
外观模式的核心类
public class Facade implements PorkMerchant, OilMerchant{ private OilMerchant oilRetailer = new OilRetailer(); private PorkMerchant porkRetailer = new PorkRetailer(); /** * 买猪肉 * @return */ public String getPork(){ System.out.println(porkRetailer.getPork()); return "Pork"; } /** * 买油 * @return */ public String getOil(){ System.out.println(oilRetailer.getOil()); return "Oil"; } }
1. 当你的系统和子系统中一些模块中多个类发生了耦合,为了减少系统的耦合度建议采用外观模式。
2. 建立一个层次结构的子树的时候,如果层次间相互依赖比较严重,那么建议采用外观模式降低耦合度。
3. 子系统相对独立
1. 减少系统的相互依赖
2. 提高系统的灵活性
3.提高安全性
源码下载地址