面向对象设计原则-开闭原则

开闭原则(Open-Closed Principle,OCP)指的是在设计一个对象(类、模块、函数)时,应遵循或做到对扩展开放、对修改关闭,其核心思想是面向接口/抽象进行编程,它是所有设计原则中最基础的原则。比如第四方支付平台,集成微信支付服务时,遵循开闭原则的话,正常的做法就是先抽象设计一个支付接口,然后微信支付类实现该支付接口。以后平台集成更多如支付宝、华为、苹果等支付服务时,只需要扩展一个对应支付方式的支付类即可,这样既扩展了新的支付服务,同时避免了修改现有的支付接口以及微信支付类,最大限度保证了新代码不会影响现有的业务代码。这就是对扩展(新对象)开放,对修改(现有对象)关闭。

代码示例

假设当前有一个第四方支付平台,下面是示范遵循开闭原则,平台方和业务方集成微信支付服务的步骤和伪代码

  • 定义支付接口PayService,而不是定义一个具体的支付服务类
// 1.支付服务接口
public interface PayService {
    // 提交支付
    void pay();
}
  • 微信支付服务实现类,实现支付接口
// 2.微信支付实现类
public class WeChatPay implements PayService {
    @Override
    public void pay() {
        // TODO 调用微信支付API
    }
}
  • 交付业务方使用,假设使用SDK的方式发布
// 3.1业务方代码:订单服务接口
public interface OrderService {
    void pay();
}
...
// 3.2订单服务实现类
public class OrderServiceImpl implements OrderService {
    // 面向接口编程:代码中不会出现具体实现类
    private PayService payService;

    // 只有在使用时才会实例化真正的实现类
    public OrderServiceImpl(PayService payService){
        this.payService = payService;
    }

    @Override
    public void pay() {
        payService.pay();
    }

    // 4.模拟业务方调用平台方SDK提供的微信支付服务
    public static void main(String[] args) {
        PayService payService = new WeChatPay();
        OrderService orderService = new OrderServiceImpl(payService);
        orderService.pay();
    }
}

到这里,业务方开始使用第四方支付平台的支付服务了。注意到业务方的代码中,只有在其应用真正运行启动时才创建/注入具体的微信支付实现类,其它代码中都是调用接口来编写代码,不会出现具体的实现类,这是良好的编程方式。

  • 平台方扩展集成新的支付服务以满足更多业务方的需求,比如支付宝支付、华为支付等
// 5.扩展支付宝支付方式
public class AliPay implements PayService {
    @Override
    public void pay() {
        // TODO 调用支付宝API
    }
}
...
// 6.扩展华为支付方式
public class HuaweiPay implements PayService {
    @Override
    public void pay() {
        // TODO 调用华为支付API
    }
}
...
// 7.扩展更多的支付方式
...

可以看到,平台方扩展集成新的支付服务如AliPay或HuaweiPay,不需要修改原有的支付接口PayService和WeChatPay代码。平台方发布新的SDK后,业务方可以按自己的需求进行更新或不更新,即使更新了,也不会影响原有的业务代码运行。

你可能感兴趣的:(面向对象设计原则-开闭原则)