在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件可扩展的灵活性,程序员要尽量根据6条来开发程序,从而提高软件开发效率,节约软件开发成本和维护成本。

1.开闭原则

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

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

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

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

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

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

java开发计划模版 java开发设计_搜狗输入法


抽象类

package com.itheima.principles.demo1;

/**
 * 抽象皮肤类
 */
public abstract class AbstractSkin {

    //显示的方法
    public abstract void display();
}

默认实现类(黑马实现类和这个一样):

package com.itheima.principles.demo1;

/**
 * 默认皮肤类
 *  继承抽象皮肤类
 */

public class DefaultSkin extends AbstractSkin {
    @Override
    public void display() {
        System.out.println("默认皮肤");
    }
}

搜狗输入法类:

package com.itheima.principles.demo1;

/**
 *  搜狗输入法
 */
public class SougouInput {

    private AbstractSkin skin;

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

    public void display() {
        skin.display();
    }

}

用户类代码:

package com.itheima.principles.demo1;

/**
 * 测试类
 */

public class Client {

    public static void main(String[] args) {
        // 1.创建搜狗输入法对象
        SougouInput sougouInput = new SougouInput();
        // 2.创建皮肤对象(默认)
        DefaultSkin defaultSkin = new DefaultSkin();
        // 3.将皮肤设置到输入法中
        sougouInput.setSkin(defaultSkin);
        // 4.显示皮肤
        sougouInput.display();

   // ======================= 切换皮肤(实现开闭原则)

        //黑马皮肤
        HeimaSkin heimaSkin = new HeimaSkin();
        sougouInput.setSkin(heimaSkin);
        sougouInput.display();
    }

}

可以看出当我们需要添加新皮肤的时候,只需要添加新的实现类,之后在client类里new一下在利用set方法传进去就ok了。