📅  最后修改于: 2023-12-03 14:43:02.908000             🧑  作者: Mango
开闭原则是指一个软件实体应该对扩展开放,对修改关闭。简言之,就是在不修改原有代码的情况下,通过扩展增加功能。
开闭原则是面向对象设计的一个基本原则,能使代码更加灵活、可扩展、易维护。遵循开闭原则可以减少修改代码的风险,降低维护成本,提升代码的质量。
我们通过一个栗子来进一步探究开闭原则。
假设我们有一个饮料类Beverage
,这个类有一个成员变量description
和一个抽象方法cost()
。
public abstract class Beverage {
protected String description;
public String getDescription() {
return description;
}
public abstract double cost();
}
这个类有两个子类:Espresso
和 Mocha
。
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
即可。这就遵循了开闭原则。
开闭原则让代码更加灵活、可扩展、易维护,对于大型应用的设计开发有着重要的意义。规范代码的设计和实现可以降低代码维护的难度,让代码更加易于扩展和重构,从而达到提高生产率的目的。