"围观"设计模式(14)--结构型之外观模式(Facade Pattern)

时间:2023-02-11 10:44:45

外观模式(Facade pattern),是软件工程中常用的一种软件设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。----WIKIPEDIA


个人理解

当一个项目中出现比较杂乱的调用关系时,类与类之间的耦合关系过于复杂,为了降低耦合度,我们可以采用一个公共的接口与其他类发生耦合,这样可以尽量大的降低外界与该系统的耦合度,同时降低了整个系统的复杂度,外观模式相当于一个公共的入口一样,为使用者敞开大门,暴漏一些必要的接口,方便外界进行调用。通俗来讲就是,有多个不同的类提供了多个访问的接口,外观模式就是要统一将这些接口进行管理。如下面两个图所示。

"围观"设计模式(14)--结构型之外观模式(Facade Pattern)

使用外观模式:

"围观"设计模式(14)--结构型之外观模式(Facade Pattern)


案例


假设这样一个情景:我想做个红烧肉,说下主要的调料需要买:五花肉、油等等,这个不是重点,说一下里面有什么类吧,五花肉的零售商、食材批发商、油的零售商,先拿这三个举例子。三者之间的关系,零售商需要向批发商购置自己需要配备的食材。而我呢,作为一个使用者,只需要去零售商那里去购置即可。


"围观"设计模式(14)--结构型之外观模式(Facade Pattern)

其中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";
}
}

上述代码比较粗糙,综合而言,如果不使用Facade外观模式,那么,WY这个类直接与这些零售商等等的类进行耦合那样的话就会导致系统的复杂,使用了Facade外观模式之后,屏蔽了子系统的一些细节,WY不再和其他的零售商的类进行耦合,只需要和Facade进行耦合即可。


观察上述类,因为不管是批发商还是零售商,他们的方法基本上一致,那么,我们可以考虑优化一下,通过接口进行进一步的优化。


"围观"设计模式(14)--结构型之外观模式(Facade Pattern)

引入接口,如果使用过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.提高安全性


源码下载

源码下载地址