外观模式(Facade Pattern)
属于结构型模式
的一种,为子系统中的一组接口提供一个统一的入口,它通过引入一个外观角色
来简化客户端与子系统之间的交互...
<!-- more -->
概述
外观模式是一种使用频率非常高的结构型设计模式,当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层
如下图:
案例
购物场景中,我们要调用产品(Product)
和支付(Pay)
等服务,这时候面对了多个复杂的业务,怎么样通过模式来解决?
创建
ProductService
和PayService
class ProductService {
public void pick() {
System.out.println("挑选小米Mix2尊享版");
}
}
class PayService {
public void pay() {
System.out.println("支付4799元");
}
}
定义外观类
FacadeOrder
由它统一调用,客户端无需关心具体实现
class FacadeOrder {
private ProductService productService;
private PayService payService;
public FacadeOrder() {
this.productService = new ProductService();
this.payService = new PayService();
}
public void buyPhone() {
this.productService.pick();
System.out.println("添加购物车");
this.payService.pay();
}
}
创建测试类
Client
public class Client {
public static void main(String[] args) {
FacadeOrder order = new FacadeOrder();
order.buyPhone();
}
}
运行结果
挑选小米Mix2尊享版
添加购物车
支付4799元
总结
细心的朋友会发现,该模式应用其实非常之广泛,与我们平时写的DAO->Service->Controller
是不是很相像呢
优点
降低了客户类与子系统类的耦合度,实现了子系统与客户之间的松耦合关系
外观模式
对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。客户程序与抽象类的实现部分之间存在着很大的依赖性,引入
Facade
将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
缺点
在不引入
抽象外观类
的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了开闭原则
与适配器模式的区别
适配器模式
是将一个对象包装起来以改变其接口,而外观模式
是将一群对象包装起来以简化其接口。适配器是将接口转换为不同接口,而外观模式是提供一个统一的接口来简化接口。
- 说点什么
全文代码:https://gitee.com/battcn/design-pattern/tree/master/Chapter8/battcn-facade
个人QQ:1837307557
battcn开源群(适合新手):391619659
微信公众号:battcn
(欢迎调戏)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。