开闭原则的概念
开闭原则简单来说就是对扩展开放,对修改关闭。
在程序需要进行拓展的时候,不能去修改原有的代码
想要达到这样的效果,就需要使用接口或者抽象类,当程序需要发生变化的时候,或者需要添加一些原来没有的东西的时候,不需要修改原来的代码,只需要新建一个实现类去扩展就好。
开闭原则的案例
我们平时在开发中最多接触的工具应该是舒服法,当然,这里指第三方的输入法比如搜狗输入法,搜狗输入法的皮肤功能就是遵循开闭原则的。一个皮肤接口/抽象类,多个实现的类。我们可以使用原生默认的输入法皮肤,也可以下载使用其他的皮肤。
简单模拟搜狗输入法中的开闭原则
写一个皮肤的抽象类,有一个展示皮肤的抽象方法
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();
}
}
当我们需要添加新的皮肤的时候,只需要继承Skin抽象类,重写display方法,然后用搜狗输入法去设置这个皮肤即可,这就是软件设计要遵循的六大原则之一的开闭原则。
我们有新需求(新皮肤)的时候不需要改变原有的代码逻辑(原有的皮肤实现类),而是直接添加一个新的派生类去实现接口/抽象类即可