敏捷软件开发总结——开放-封闭原则(OCP)

开放-封闭原则(OCP)的意义

任何系统在其生命周期中都会发生变化,那么怎样的设计才能面对需求变化而保持相对稳定?著名的开放-封闭原则(OCP)为我们提供了指引。

如果程序中的一处改动就会造成连锁反应,导致一系列相关模块改动,那么设计就具有僵化性。OCP建议我们对此重构,这样以后改动就只需要添加新的代码,而不必修改已经正常运行的代码。

关键是抽象

策略(Strategy)模式和模板方法(Template Method)模式是满足OCP的最常用方法。

策略(Strategy)模式

模块可以调用一个抽象接口,由于模块依赖于一个固定的抽象接口,所以对于它的更改可以是封闭的。同时通过创建派生类实现该抽象接口,该扩展则是开放的。这就是典型的策略(Strategy)模式。
敏捷软件开发总结——开放-封闭原则(OCP)

例:

public class Context {
    //持有一个具体策略的对象
    private Strategy strategy;
    /**
     * 构造函数,传入一个具体策略对象
     * @param strategy    具体策略对象
     */
    public Context(Strategy strategy){
        this.strategy = strategy;
    }
    /**
     * 策略方法
     */
    public void contextInterface(){
        strategy.algorithmInterface();
    }
}

public interface Strategy {
    /**
     * 策略方法
     */
    public void algorithmInterface();
}

public class ConcreteStrategyA implements Strategy {

    @Override
    public void  algorithmInterface() {
        //相关的业务
    }

}

public class ConcreteStrategyB implements Strategy {

    @Override
    public void  algorithmInterface() {
        //相关的业务
    }

}

public class ConcreteStrategyC implements Strategy {

    @Override
    public void  algorithmInterface() {
        //相关的业务
    }

}
模板方法(Template Method)模式

准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
敏捷软件开发总结——开放-封闭原则(OCP)