根据实际案例分析外观模式 Facade
- 案例: 假设一个放电影功能,在播放电影时,需要放下窗帘,打开空调,打开播放机,打开音响,考虑用户观影时间较长时,提供暂停播放,窗帘上升,关闭音响,关闭空调,当播放完毕后,升起窗帘全部关闭
- 传统模式下客户端可能需要一个一个的进行调用,客户端调用比较繁琐,
- 外观模式: 对子系统中的接口进行分组,对一组接口提供一个一致的外部访问接口,通过这个接口屏蔽内部实现细节,调用者根据功能调用一个接口即可,减少其它步骤,无需关心细节
示例
- 创建功能实体类,电影,窗帘,空调,音响
class Film{
public void start(){
System.out.println("开始播放电影");
}
public void stop(){
System.out.println("暂停播放,休息一下");
}
public void end(){
System.out.println("电影播放结束");
}
}
class Curtain{
public void up(){
System.out.println("升起窗帘");
}
public void down(){
System.out.println("下降窗帘");
}
}
class AirConditioner{
public void start(){
System.out.println("启动空调");
}
public void stop(){
System.out.println("暂停空调");
}
public void end(){
System.out.println("关闭空调");
}
}
class Sound{
public void start(){
System.out.println("启动音响");
}
public void end(){
System.out.println("关闭音响");
}
}
- 创建外观类,将具体功能类组合到外观类中,注意根据需求,选择实例化的功能类在外观者中的实例化方式,此处为了方便在外观类的构造器中new实例化,定义功能方法,对具体功能类的功能进行分组,通过该方法进行统一调用
class Home{
private Film film;
private Curtain curtain;
private AirConditioner airConditioner;
private Sound sound;
public Home(){
this.film = new Film();
this.curtain = new Curtain();
this.airConditioner = new AirConditioner();
this.sound = new Sound();
}
public void start(){
curtain.down();
airConditioner.start();
sound.start();
film.start();
}
public void stop(){
film.stop();
airConditioner.stop();
curtain.up();
sound.end();
}
public void end(){
film.end();
airConditioner.end();
curtain.up();
sound.end();
}
}
- 调用测试,客户端通过外观类进行统一调用实现功能
public class Test4 {
public static void main(String[] args) {
Home home = new Home();
home.start();
System.out.println();
home.stop();
System.out.println();
home.end();
}
}
- 流程图(不是UML)
业务与设计模式落地案例
- 使用外观模式来实现一个简单的订单管理系统
- 定义三个子系统类:OrderService、PaymentService 和 ShippingService。分别负责处理订单创建、支付和运输等任务,具体代码如下(由于只是单纯的配合设计模式演示,并且子系统中没有特殊业务,所以当前的service都不需要注入到容器中)
public class OrderService {
public void createOrder(String orderInfo) {
System.out.println("Creating order: " + orderInfo);
}
}
public class PaymentService {
public void makePayment(String paymentInfo) {
System.out.println("Making payment: " + paymentInfo);
}
}
public class ShippingService {
public void shipOrder(String address) {
System.out.println("Shipping to: " + address);
}
}
- 定义一个外观类 OrderFacade,它将上述三个子系统整合在一起,提供一个简单的接口,以便客户端能够更加方便地使用整个订单系统的功能
public class OrderFacade {
private OrderService orderService;
private PaymentService paymentService;
private ShippingService shippingService;
public OrderFacade(OrderService orderService, PaymentService paymentService, ShippingService shippingService) {
this.orderService = orderService;
this.paymentService = paymentService;
this.shippingService = shippingService;
}
public void createOrder(String orderInfo, String paymentInfo, String address) {
orderService.createOrder(orderInfo);
paymentService.makePayment(paymentInfo);
shippingService.shipOrder(address);
}
}
- 提供一个简单的接口 OrderController,用于演示整个订单流程
@RestController
public class OrderController {
private OrderFacade orderFacade;
public OrderController() {
OrderService orderService = new OrderService();
PaymentService paymentService = new PaymentService();
ShippingService shippingService = new ShippingService();
this.orderFacade = new OrderFacade(orderService, paymentService, shippingService);
}
@PostMapping("/order")
public String createOrder(@RequestBody OrderRequest request) {
orderFacade.createOrder(request.getOrderInfo(), request.getPaymentInfo(), request.getAddress());
return "Order created successfully.";
}
}