开放封闭原则(OCP)是软件设计的一个基本原则。它指的是软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。也就是说,当需要增加或修改一个功能时,应该尽量通过扩展软件实体的行为来实现,而不是修改已有的代码。
实践方法
- 抽象出可变与不可变
- 使用抽象类与接口
- 使用继承
- 使用多态
- 使用模板方法模式
- 使用策略模式
- 使用职责链模式
要将可变与不可变的部分分离出来,将不可变的部分抽象出来,放在抽象类或接口中,以便于子类实现或继承。可变的部分,可以使用继承来实现,以实现可拓展的功能。可以使用多态来实现,以便于子类有不同的实现方式。可以使用模板方法模式来实现,即在父类中定义一个模板方法,用于定义一个算法的骨架,而将一些步骤延迟到子类中实现。可以使用策略模式来实现,即定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。可以使用职责链模式来实现,即定义一系列的处理类,每个处理类中包含对请求的处理逻辑,并负责将请求传递给下一个处理类。
public abstract class AbstractHandler {
private AbstractHandler nextHandler;
public void setNextHandler(AbstractHandler handler) {
this.nextHandler = handler;
}
public AbstractHandler getNextHandler() {
return this.nextHandler;
}
public abstract void handleRequest(String request);
}
public class ConcreteHandler1 extends AbstractHandler {
@Override
public void handleRequest(String request) {
if (request.equals("request1")) {
// 处理请求1
} else {
// 传递给下一个处理类
if (this.getNextHandler() != null) {
this.getNextHandler().handleRequest(request);
}
}
}
}
public class ConcreteHandler2 extends AbstractHandler {
@Override
public void handleRequest(String request) {
if (request.equals("request2")) {
// 处理请求2
} else {
// 传递给下一个处理类
if (this.getNextHandler() != null) {
this.getNextHandler().handleRequest(request);
}
}
}
}
开放封闭原则是软件设计中一个重要的原则,可以使软件具有更好的可扩展性和可维护性,在软件设计中应当尽量遵循这个原则。