1,概念描述
对扩展开放,对修改关闭。 在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。
想要达到这样的效果,我们需要使用接口和抽象类。
因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。
2,案例演示
【例】搜狗输入法 的皮肤设计。
分析: 搜狗输入法 的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换自己的输入法的皮肤,也可以从网上下载新的皮肤。这些皮肤有共同的特点,可以为其定义一个抽象类(AbstractSkin),而每个具体的皮肤(DefaultSpecificSkin和HeimaSpecificSkin)是其子类。用户窗体可以根据需要选择或者增加新的主题,而不需要修改原代码,所以它是满足开闭原则的。
2.1 创建抽象皮肤类(抽象类)
/**
* 抽象皮肤类
*/
public abstract class AbstractSkin{
//显示的方法
public abstract String display();
}
2.2 创建默认皮肤类
package com.study.designpatternboot.demo01_设计模式相关内容介绍.demo02_软件设计原则.demo01_开闭原则.demo02_开闭原则代码案例;
public class DefaultSkin extends AbstractSkin{
@Override
public String display() {
// System.out.println("默认皮肤类");
return "默认皮肤类";
}
}
2.3 创建动漫皮肤类
package com.study.designpatternboot.demo01_设计模式相关内容介绍.demo02_软件设计原则.demo01_开闭原则.demo02_开闭原则代码案例;
public class CarToonSkin extends AbstractSkin {
@Override
public String display() {
return "动漫皮肤";
}
}
2.4 创建搜狗输入法类
package com.study.designpatternboot.demo01_设计模式相关内容介绍.demo02_软件设计原则.demo01_开闭原则.demo02_开闭原则代码案例;
public class SougouInput {
private AbstractSkin skin;
public void setSkin(AbstractSkin skin) {
this.skin = skin;
}
public String display(){
String display = skin.display();
return display;
}
}
2.5 测试
package com.study.designpatternboot.demo01_设计模式相关内容介绍.demo02_软件设计原则.demo01_开闭原则.demo02_开闭原则代码案例;
public class Client {
public static void main(String[] args) {
SougouInput sougouInput = new SougouInput();
//创建皮肤对象
// DefaultSkin defaultSkin = new DefaultSkin();
// HeiMaSkin heiMaSkin = new HeiMaSkin();
AbstractSkin maSkin = new DefaultSkin();
sougouInput.setSkin(maSkin);
String display = sougouInput.display();
System.out.println(display);
}
}