📜  Java的开闭原则与示例(1)

📅  最后修改于: 2023-12-03 14:43:02.908000             🧑  作者: Mango

Java的开闭原则与示例

什么是开闭原则?

开闭原则是指一个软件实体应该对扩展开放,对修改关闭。简言之,就是在不修改原有代码的情况下,通过扩展增加功能。

引入开闭原则的意义

开闭原则是面向对象设计的一个基本原则,能使代码更加灵活、可扩展、易维护。遵循开闭原则可以减少修改代码的风险,降低维护成本,提升代码的质量。

栗子分析

我们通过一个栗子来进一步探究开闭原则。

假设我们有一个饮料类Beverage,这个类有一个成员变量description和一个抽象方法cost()

public abstract class Beverage {
    protected String description;

    public String getDescription() {
        return description;
    }

    public abstract double cost();
}

这个类有两个子类:EspressoMocha

public class Espresso extends Beverage {
    public Espresso() {
        description = "Espresso";
    }

    @Override
    public double cost() {
        return 1.99;
    }
}

public class Mocha extends Beverage {
    public Mocha() {
        description = "Mocha";
    }

    @Override
    public double cost() {
        return 2.99;
    }
}

现在我们需要添加一些调料,比如牛奶、摩卡等,可以在饮料上添加这些调料,但是价格也会随之改变。我们可以直接在每个饮料类中添加相关的代码来计算价格,但是这样会违反开闭原则,因为每次添加新的调料都需要修改旧的代码。所以我们需要对其进行改进。

我们可以新建一个调料类CondimentDecorator,将所有的调料都放在这个类中,这个类也继承Beverage类。

public abstract class CondimentDecorator extends Beverage {
    public abstract String getDescription();
}

然后定义所有的具体调料类,这些类继承CondimentDecorator

public class Milk extends CondimentDecorator {
    Beverage beverage;

    public Milk(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Milk";
    }

    @Override
    public double cost() {
        return .10 + beverage.cost();
    }
}

public class Mocha extends CondimentDecorator {
    Beverage beverage;

    public Mocha(Beverage beverage) {
        this.beverage = beverage;
    }

    @Override
    public String getDescription() {
        return beverage.getDescription() + ", Mocha";
    }

    @Override
    public double cost() {
        return .20 + beverage.cost();
    }
}

这样,如果我们想要在饮料中加入新的调料,只需要创建一个新的具体调料类并继承CondimentDecorator即可。这就遵循了开闭原则。

总结

开闭原则让代码更加灵活、可扩展、易维护,对于大型应用的设计开发有着重要的意义。规范代码的设计和实现可以降低代码维护的难度,让代码更加易于扩展和重构,从而达到提高生产率的目的。