Skip to content

开闭原则

对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。 想要达到这样的效果,我们需要使用接口和抽象类。 因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。

举个栗子

下面以 搜狗输入法 的皮肤为例介绍开闭原则的应用。

【例】搜狗输入法 的皮肤设计。

分析:搜狗输入法 的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换自己的输入法的皮肤,也可以从网上下载新的皮肤。这些皮肤有共同的特点,可以为其定义一个抽象类(AbstractSkin),而每个具体的皮肤(DefaultSpecificSkin和NcSpecificSkin)是其子类。用户窗体可以根据需要选择或者增加新的主题,而不需要修改原代码,所以它是满足开闭原则的。

代码实现

java
package com.notecove.designpractice.lsth;

/**
* 皮肤共同特征
*/
public abstract class AbstractSkin {
    public abstract void display();
}
java
package com.notecove.designpractice.lsth;

public class DefaultSpecificSkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("切换默认皮肤成功");
    }
}
java
package com.notecove.designpractice.lsth;

public class NcSpecificSkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("切换java皮肤成功");
    }
}
java
package com.notecove.designpractice.lsth;

/**
* 搜狗输入法
*/
public class SougoInput {
    private AbstractSkin skin;
    public SougoInput(AbstractSkin skin){
        this.skin=skin;
    }
    public void display(){
        skin.display();
    }
    
}
java
package com.notecove.designpractice.lsth;

public class Client {

    public static void main(String[] args) {
        NcSpecificSkin ncSpecificSkin =new NcSpecificSkin();
        DefaultSpecificSkin defaultSpecificSkin=new DefaultSpecificSkin();
        SougoInput sougoInput=new SougoInput(defaultSpecificSkin);
        sougoInput.display();
    }

}

想用哪个皮肤时就传哪个实现类进去,如果想要扩展皮肤直接继承AbstractSkin实现扩展就好了