开闭原则实战

一点睛

对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。

想要达到这样的效果,我们需要使用接口和抽象类。

因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。

二 需求

下面以 搜狗输入法 的皮肤为例介绍开闭原则的应用。
分析:搜狗输入法 的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换自己的输入法的皮肤,也可以从网上下载新的皮肤。这些皮肤有共同的特点,可以为其定义一个抽象类(AbstractSkin),而每个具体的皮肤(DefaultSpecificSkin和HeimaSpecificSkin)是其子类。用户窗体可以根据需要选择或者增加新的主题,而不需要修改原代码,所以它是满足开闭原则的。
在这里插入图片描述

三 实现

1 代码

AbstractSkin

/**
 * @version v1.0
 * @ClassName: AbstractSkin
 * @Description: 抽象皮肤类
 * @Author: cakin
 */
public abstract class AbstractSkin {
    // 显示的方法
    public abstract void display();
}

DefaultSkin

/**
 * @version v1.0
 * @ClassName: DefaultSkin
 * @Description: 默认皮肤类
 * @Author: cakin
 */
public class DefaultSkin extends AbstractSkin {
    public void display() {
        System.out.println("默认皮肤");
    }
}

HeimaSkin

/**
 * @version v1.0
 * @ClassName: HeimaSkin
 * @Description: 黑马程序员皮肤
 * @Author: cakin
 */
public class HeimaSkin extends AbstractSkin {
    public void display() {
        System.out.println("黑马皮肤");
    }
}

SougouInput

/**
 * @version v1.0
 * @ClassName: SougouInput
 * @Description: 搜狗输入法
 * @Author: cakin
 */
public class SougouInput {
    private AbstractSkin skin;

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

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

Client

/**
 * @version v1.0
 * @ClassName: Client
 * @Description: 测试类
 * @Author: cakin
 */
public class Client {
    public static void main(String[] args) {
        // 1 创建搜狗输入法对象
        SougouInput input = new SougouInput();
        // 2 创建皮肤对象
        // DefaultSkin skin = new DefaultSkin();
        HeimaSkin skin = new HeimaSkin();
        // 3 将皮肤设置到输入法中
        input.setSkin(skin);
        // 4 显示皮肤
        input.display();
    }
}

2 测试

黑马皮肤
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值