设计模式六大原则-开闭原则(1/6)

344 阅读2分钟

开闭原则的概念

开闭原则简单来说就是对扩展开放,对修改关闭。

在程序需要进行拓展的时候,不能去修改原有的代码

想要达到这样的效果,就需要使用接口或者抽象类,当程序需要发生变化的时候,或者需要添加一些原来没有的东西的时候,不需要修改原来的代码,只需要新建一个实现类去扩展就好。

开闭原则的案例

我们平时在开发中最多接触的工具应该是舒服法,当然,这里指第三方的输入法比如搜狗输入法,搜狗输入法的皮肤功能就是遵循开闭原则的。一个皮肤接口/抽象类,多个实现的类。我们可以使用原生默认的输入法皮肤,也可以下载使用其他的皮肤。

简单模拟搜狗输入法中的开闭原则

写一个皮肤的抽象类,有一个展示皮肤的抽象方法

public abstract class Skin {

    /**
     * 展示皮肤
     */
    public abstract void display();
}

编写三个皮肤的实现

public class DefaultSkin extends Skin {

    /**
     * 重写皮肤展示方法
     */
    @Override
    public void display() {
        System.out.println("展示默认皮肤");
    }
}
public class ExternalFirstSkin extends Skin{

    /**
     * 重写皮肤展示方法
     */
    @Override
    public void display() {
        System.out.println("展示第三方皮肤1");
    }
}
public class ExternalSecondSkin extends Skin {

    /**
     * 重写皮肤展示方法
     */
    @Override
    public void display() {
        System.out.println("展示第三方皮肤2");
    }
}

编写搜狗输入法本体

public class SougouInput {


    private Skin skin = new DefaultSkin();

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


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

初始化皮肤为默认皮肤。即不设置皮肤的时候让它为默认皮肤

测试

public class Test {

    public static void main(String[] args) {
        SougouInput sougouInput = new SougouInput();
        sougouInput.display();

        sougouInput.setSkin(new ExternalFirstSkin());
        sougouInput.display();

        sougouInput.setSkin(new ExternalSecondSkin());
        sougouInput.display();
    }
}

image.png

当我们需要添加新的皮肤的时候,只需要继承Skin抽象类,重写display方法,然后用搜狗输入法去设置这个皮肤即可,这就是软件设计要遵循的六大原则之一的开闭原则。

我们有新需求(新皮肤)的时候不需要改变原有的代码逻辑(原有的皮肤实现类),而是直接添加一个新的派生类去实现接口/抽象类即可