隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口
当访问流程复杂时,将系统融合成一个接口供外部使用,定义了系统的入口
事例
需求:客户下单了水果,需要经过“采摘->包装->送货”三个流程。
若客户直接访问这三个流程,调用繁琐而且对外暴露了其他无用的成员。需要封装
数据结构如图:
接口及其实现类如下:
public interface PickService {
void pick();
// 实现类
class PickServiceImpl implements PickService {
// ...其他字段和方法
@Override
public void pick() {
}
}
}
public interface PackService {
void pack();
// 实现类
class PackServiceImpl implements PackService {
// ...其他字段和方法
@Override
public void pack() {
}
}
}
public interface SendService {
void send();
// 实现类
class SendServiceImpl implements SendService {
// ...其他字段和方法
@Override
public void send() {
}
}
}
将下单涉及的服务都整合在外观类中,整合后直接提供给客户调用
外观类:
public class OrderFacade {
private PickService mPickService;
private PackService mPackService;
private SendService mSendService;
public OrderFacade() {
// 初始化所有服务
mPickService = new PickService.PickServiceImpl();
mPackService = new PackService.PackServiceImpl();
mSendService = new SendService.SendServiceImpl();
}
// 客户下单
public void order() {
mPickService.pick();
mPackService.pack();
mSendService.send();
}
}
总结
适用场景
- 为复杂的流程提供外界访问的接口
- 预防低水平技术人员带来的风险
优点
- 减少系统与客户的耦合,隐藏了底层服务
- 提高了安全性
缺点
- 不符合开闭原则。无法继承和重写,修改系统时,就要修改外观类
- 外部仍然可以直接访问子系统