什么叫外观模式
什么是外观模式? 外观模式也叫门面模式,它为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
界面:主要指从一个组件外部来看这个组件,能够看到什么,这就是这个组件的界面,即外观(这里不是我们想的那么简单的GUI)。
接口:主要是指外部和内部交互的一个通道,通常是指一些方法,可以是类方法,也可以使interface的方法。
外观模式的场景
比如,我们装修好了一座房子后,需要购买桌椅板凳,家用电器,是不是跑了家具市场,还要跑家电市场,如果有这么一家装修公司,你只需要告诉他你需要什么类型的家具,什么品牌的电器。他就会帮你采购回来,你就不需要关心在哪买的,这样是不是省心很多呢,看下图
如果没有通过装修公司这个门面,那就所以功能都得自己跑。。。
代码实现
实现家具市场购买家具的接口
/**
* @Author: dengcs
* @Date: 2020/6/28 15:43
* Comment:购买家具接口
*/
public interface BuyA {
public void buyJj();
}
购买家具实现类
/**
* @Author: dengcs
* @Date: 2020/6/28 15:50
* Comment:购买家具实现接口
*/
public class BuyAimpl implements BuyA{
@Override
public void buyJj() {
System.out.println("购买家具---桌椅板凳");
}
}
实现家电市场购买家电的接口
/**
* @Author: dengcs
* @Date: 2020/6/28 15:43
* Comment:购买家电接口
*/
public interface BuyB {
public void buyJd();
}
购买家电实现类
/**
* @Author: dengcs
* @Date: 2020/6/28 15:50
* Comment:购买家电实现接口
*/
public class BuyBimpl implements BuyB{
@Override
public void buyJd() {
System.out.println("购买家电---冰箱电视");
}
}
然后编写一个外观模式的接口
/**
* @Author: dengcs
* @Date: 2020/6/28 15:54
* Comment:外观接口
*/
public interface Facade {
public void buy();
}
最后实现外观接口buy
/**
* @Author: dengcs
* @Date: 2020/6/28 15:54
* Comment:外观接口实现
*/
public class FacadeImpl implements Facade {
@Override
public void buy() {
BuyA buyA = new BuyAimpl();
//购买家具
buyA.buyJj();
BuyB buyB = new BuyBimpl();
//购买家电
buyB.buyJd();
}
}
测试
编写一个测类
/**
* @Author: dengcs
* @Date: 2020/6/28 15:58
* Comment:外观模式测试
*/
public class Facadetest {
public static void main(String[] args) {
Facade facade = new FacadeImpl();
facade.buy();
}
}
测试结果为
写在最后
优点
(1)松散耦合(外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护);
(2)简单易用(外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观交互就可以了,相当于外观类为外部客户端使用子系统提供了一站式服务)
(3)更好地划分访问的层次(通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到外观中,这样既方便客户端使用,也很好地隐藏了内部的细节)
缺点
过多的或者是不太合理的Facade也容易让人迷惑。到底是调用Facade还是直接调用模块,这是一个艰难的选择。
想了解更多的设计模块,请关注我吧。。_