1.1 开闭原则
对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。
想要达到这样的效果,我们需要使用接口和抽象类。
因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。
下面以 LOL
的皮肤为例介绍开闭原则的应用。
【例】LOL
的皮肤设计。
分析:每个英雄都有自己的皮肤,这些皮肤有共同的特点,可以为其定义一个抽象类(AbstractSkin),而每个具体的皮肤(DefaultSkin和MetalGearSkin)是其子类。英雄类想要使用那个皮肤,只需要依赖皮肤的抽象类,用抽象类去接受子类,调用子类的方法,这样每次更改皮肤,就不用去改英雄类了,、而不需要修改原代码,所以它是满足开闭原则的。
皮肤接口:
public abstract class AbstractSkin {
/*
显示皮肤类
*/
public abstract void display();
}
默认皮肤:
public class DefaultSkin extends AbstractSkin{
@Override
public void display() {
System.out.println("默认皮肤类");
}
}
合金装备皮肤:
public class MetalGearSkin extends AbstractSkin{
@Override
public void display() {
System.out.println("合金装备亚索");
}
}
英雄类:
public class YasuoHero {
private AbstractSkin skin;
public void setSkin(AbstractSkin skin){
this.skin = skin;
}
public void display(){
skin.display();
}
}
测试类:
public class Client {
public static void main(String[] args) {
//1、创建英雄亚索
YasuoHero yasuo = new YasuoHero();
//2、创建皮肤对象
// DefaultSkin skin = new DefaultSkin();
MetalGearSkin skin = new MetalGearSkin();
yasuo.setSkin(skin);
yasuo.display();
}
}