3.1开闭原则
对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类。
如下,分析搜狗输入法皮肤设计:
分析:搜狗输入法的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根绝自己的喜爱更换不同的输入法皮肤,也可以从网上下载新的皮肤。这些皮肤有共同的特点,可以将这些共同的的特点抽取到一个抽象类(AbstractSkin)中,而每个具体的皮肤(DefaultSkin、MySkin)是其子类。用户可以根据需要选择或者增加新的主题,而不需要修改原代码。
// 抽象类
public abstract class AbstractSkin {
public abstract void displaySkin();
}
=========================================================
//实现类
public class DefaultSkin extends AbstractSkin{
@Override
public void displaySkin() {
System.out.println("这是默认皮肤...");
}
}
=========================================================
//实现类
public class MySkin extends AbstractSkin{
@Override
public void displaySkin() {
System.out.println("这是自己的皮肤...");
}
}
=========================================================
/**
* 实现聚合的类
*/
public class SouGouInput {
//成员变量是AbstractSkin类型,(实现聚合)
private AbstractSkin skin;
public void setSkin(AbstractSkin skin) {
this.skin = skin;
}
//普通方法
public void display(){
//根据设置(setXxx)的成员变量的不同,来调用不同成员变量的皮肤
//这里的成员变量类型是抽象类型,
//所以是根据传递不同实现类的对象而调用不同的实现类里重写后的方法来显示不同的皮肤
skin.displaySkin();
}
}
=========================================================
//测试类
public class ClinentTest {
public static void main(String[] args) {
//1. 创建搜狗输入法对象,将各种皮肤聚合到一起
SouGouInput sgi = new SouGouInput();
// 2.创建皮肤对象
//2.1 常规
// DefaultSkin ds = new DefaultSkin();
// 2.2多态
AbstractSkin ds = new DefaultSkin();
MySkin ms = new MySkin();
// 3.将皮肤设置到输入法中
sgi.setSkin(ds);
// sgi.setSkin(ms);
// 4.显示皮肤
sgi.display();//这是默认皮肤...
//当有新的输入法皮肤时候,只需重新创建一个皮肤类去继承抽象类,
//然后重写里面的抽象方法,再在测试类中添加即可。而不用修改之前的代码
}
}