设计模式原则(开闭原则)

介绍

开闭原则(Open/Closed Principle,OCP)是面向对象设计原则中的一个重要原则,旨在提高软件的可维护性和可扩展性。开闭原则的定义是:“软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。” 也就是说,设计一个系统时,我们应该能够通过添加新代码来扩展功能,而不需要修改现有的代码。

概述

定义:

  • 开放(Open for extension):当需求变化或系统需要扩展功能时,可以通过添加新的代码或功能来实现。
  • 关闭(Closed for modification):系统的现有代码在功能扩展时不需要修改,以减少引入错误的风险。

目标:

  • 降低系统在面对需求变化时的风险。
  • 提高系统的灵活性和可维护性。

应用场景

  1. 业务逻辑的变化:当业务需求变更时,可以通过扩展系统的功能来适应新需求,而不需要修改现有的业务逻辑。
  2. 插件化系统:当需要在系统中添加新的插件或功能时,可以通过插件机制来实现,系统核心代码保持不变。
  3. 算法的变化:当需要改变算法的实现时,通过策略模式等设计模式实现算法的替换,而不修改原有代码。

示例代码

以下是一个基于开闭原则的示例,展示了如何通过策略模式来实现不同类型的折扣计算,而不修改现有代码。

示例:折扣计算
假设我们有一个电子商务系统,系统需要根据不同的折扣策略来计算订单的总价。

需求:

计算订单总价时,可以应用不同的折扣策略,如“百分比折扣”和“固定金额折扣”。
不符合开闭原则的代码:

public class Order {
    private double totalAmount;

    public Order(double totalAmount) {
        this.totalAmount = totalAmount;
    }

    public double applyDiscount(String discountType) {
        if (discountType.equals("PERCENTAGE")) {
            return totalAmount * 0.9; // 10%折扣
        } else if (discountType.equals("FIXED")) {
            return totalAmount - 10; // 固定10元折扣
        }
        return totalAmount;
    }
}

在这个代码中,如果需要添加新的折扣类型,我们需要修改 applyDiscount 方法的实现。这违反了开闭原则。

符合开闭原则的代码:

// 折扣策略接口,定义了折扣计算的策略方法
interface DiscountStrategy {
    double applyDiscount(double totalAmount);
}

// 具体的百分比折扣策略实现
class PercentageDiscountStrategy implements DiscountStrategy {
    private final double percentage;

    public PercentageDiscountStrategy(double percentage) {
        this.percentage = percentage;
    }

    @Override
    public double applyDiscount(double totalAmount) {
        return totalAmount * (1 - percentage);
    }
}

// 具体的固定金额折扣策略实现
class FixedAmountDiscountStrategy implements DiscountStrategy {
    private final double discountAmount;

    public FixedAmountDiscountStrategy(double discountAmount) {
        this.discountAmount = discountAmount;
    }

    @Override
    public double applyDiscount(double totalAmount) {
        return totalAmount - discountAmount;
    }
}

// 订单类,应用折扣策略来计算订单总价
class Order {
    private final double totalAmount;
    private DiscountStrategy discountStrategy;

    public Order(double totalAmount) {
        this.totalAmount = totalAmount;
    }

    // 设置折扣策略
    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    // 应用折扣策略
    public double calculateTotal() {
        if (discountStrategy != null) {
            return discountStrategy.applyDiscount(totalAmount);
        }
        return totalAmount;
    }
}

// 测试代码
public class Main {
    public static void main(String[] args) {
        Order order = new Order(100); // 创建一个订单,总价为100

        // 使用10%的百分比折扣策略
        order.setDiscountStrategy(new PercentageDiscountStrategy(0.1));
        System.out.println("Total with 10% discount: " + order.calculateTotal());

        // 使用固定金额折扣策略,减去10元
        order.setDiscountStrategy(new FixedAmountDiscountStrategy(10));
        System.out.println("Total with 10 units fixed discount: " + order.calculateTotal());
    }
}

代码解释

  1. DiscountStrategy 接口:定义了一个 applyDiscount(double totalAmount)
    方法,这是所有折扣策略的共同接口。

  2. PercentageDiscountStrategyFixedAmountDiscountStrategy 类:实现了
    DiscountStrategy 接口,分别提供了百分比折扣和固定金额折扣的具体实现。

  3. Order 类

    包含订单的总金额 totalAmount。
    通过 setDiscountStrategy() 方法来设置当前使用的折扣策略。
    calculateTotal() 方法应用当前设置的折扣策略来计算订单的最终总价。

  4. 测试代码:展示了如何使用不同的折扣策略来计算订单总价。通过 setDiscountStrategy()
    方法可以动态地设置和更改折扣策略。

优点

  • 扩展性强:要添加新的折扣策略,只需实现 DiscountStrategy 接口,并在 Order 类中使用新策略即可,完全不需要修改现有的Order 类或其他折扣策略类的代码。
  • 符合开闭原则:代码对扩展开放,对修改关闭。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值