软件设计原则—开闭原则

在程序需要进行拓展的时候,不能去修改原有的代码,而是实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。

想要达到这样的效果,我们需要使用接口和抽象类。

因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。

抽象方法定义的就是规范

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

分析:搜狗输入法 的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换自己的输入法的皮肤,也可以从网上下载新的皮肤。

这些皮肤有共同的特点,可以为其定义一个抽象类AbstractSkin,而每个具体的皮肤例如defaultSkindiySkinAbstractSkin的子类。用户窗体可以根据需要选择或者增加新的主题,而不需要修改原代码,所以它是满足开闭原则的。

image

sougou

package com.lmcode.principles.opencloseprinciple;

public class sougou {
    private AbstractSkin skin;

    public void setSkin(AbstractSkin skin) {
        this.skin = skin;
    }
    
    public void display(){
        skin.display();
    }
}

AbstractSkin

package com.lmcode.principles.opencloseprinciple;

// 抽象皮肤类
public abstract class AbstractSkin {
    // 显示皮肤
    public abstract void display();
}

defaultSkin

package com.lmcode.principles.opencloseprinciple;

// 默认皮肤类
public class defaultSkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("默认皮肤使用成功");
    }
}

diySkin

package com.lmcode.principles.opencloseprinciple;

// 默认皮肤类
public class diySkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("自定义皮肤使用成功");
    }
}

main

package com.lmcode.principles.opencloseprinciple;

public class main {
    public static void main(String[] args) {
        // 创建搜狗输入法对象,皮肤对象
        sougou sougou = new sougou();
        defaultSkin skin = new defaultSkin();
        // 将皮肤设置到输入法中
        sougou.setSkin(skin);
        // 显示皮肤
        sougou.display();
    }
}

如果此时有新皮肤,只需要新增皮肤类实现皮肤抽象类即可。

posted @ 2024-05-19 16:38  燕子去了  阅读(12)  评论(0编辑  收藏  举报

Powered by .NET 8.0 on Kubernetes

我会翻山越岭,到每一个我想去的地方

...