外观设计模式

根据实际案例分析外观模式 Facade

  1. 案例: 假设一个放电影功能,在播放电影时,需要放下窗帘,打开空调,打开播放机,打开音响,考虑用户观影时间较长时,提供暂停播放,窗帘上升,关闭音响,关闭空调,当播放完毕后,升起窗帘全部关闭
  2. 传统模式下客户端可能需要一个一个的进行调用,客户端调用比较繁琐,
  3. 外观模式: 对子系统中的接口进行分组,对一组接口提供一个一致的外部访问接口,通过这个接口屏蔽内部实现细节,调用者根据功能调用一个接口即可,减少其它步骤,无需关心细节

示例

  1. 创建功能实体类,电影,窗帘,空调,音响
//电影
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("关闭音响");
    }
}
  1. 创建外观类,将具体功能类组合到外观类中,注意根据需求,选择实例化的功能类在外观者中的实例化方式,此处为了方便在外观类的构造器中new实例化,定义功能方法,对具体功能类的功能进行分组,通过该方法进行统一调用
//外观者
class Home{
    //将功能类组合进来,注意初始化方式,
    //此处因为做示例,在构造器中new创建
    //实际可以根据需求,选在初始化方式
    //例如在功能类中提供实例化方法,在
    //外观者构造器中进行调用
    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();
    }
}
  1. 调用测试,客户端通过外观类进行统一调用实现功能
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();
    }
}
  1. 流程图(不是UML)
    在这里插入图片描述

业务与设计模式落地案例

  1. 使用外观模式来实现一个简单的订单管理系统
  2. 定义三个子系统类: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);
    }
}
  1. 定义一个外观类 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);
    }
}
  1. 提供一个简单的接口 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.";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值