设计模式-软件设计原则-开闭原则
软件设计原则
在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。
1 开闭原则
对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。
想要达到这样的效果,我们需要使用接口和抽象类。
因为抽象灵活性好,适应性广,只要抽象的合理,可以基本保持软件架构的稳定。而软件中易变的细节可以从抽象派生来的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类来扩展就可以了。
下面以 搜狗输入法 的皮肤为例介绍开闭原则的应用。
【例】搜狗输入法 的皮肤设计。
分析:搜狗输入法 的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根据自己的喜爱更换自己的输入法的皮肤,也可以从网上下载新的皮肤。这些皮肤有共同的特点,可以为其定义一个抽象类(AbstractSkin),而每个具体的皮肤(DefaultSpecificSkin和HeimaSpecificSkin)是其子类。用户窗体可以根据需要选择或者增加新的主题,而不需要修改原代码,所以它是满足开闭原则的。
2 代码实现
AbstractSkin
package com.mangoubiubiu.designpractice.lsth; /** * 皮肤共同特征 */ public abstract class AbstractSkin { public abstract void display(); }
DefaultSpecificSkin
package com.mangoubiubiu.designpractice.lsth; public class DefaultSpecificSkin extends AbstractSkin{ @Override public void display() { System.out.println("切换默认皮肤成功"); } }
HeimaSpecificSkin
package com.mangoubiubiu.designpractice.lsth; public class HeimaSpecificSkin extends AbstractSkin{ @Override public void display() { System.out.println("切换java皮肤成功"); } }
SougoInput
package com.mangoubiubiu.designpractice.lsth; /** * 搜狗输入法 */ public class SougoInput { private AbstractSkin skin; public SougoInput(AbstractSkin skin){ this.skin=skin; } public void display(){ skin.display(); } }
Client
package com.mangoubiubiu.designpractice.lsth; public class Client { public static void main(String[] args) { HeimaSpecificSkin heimaSpecificSkin =new HeimaSpecificSkin(); DefaultSpecificSkin defaultSpecificSkin=new DefaultSpecificSkin(); SougoInput sougoInput=new SougoInput(defaultSpecificSkin); sougoInput.display(); } }
想用哪个皮肤时就传哪个实现类进去,如果想要扩展皮肤直接继承AbstractSkin实现扩展就好了
本文作者:KwFruit
本文链接:https://www.cnblogs.com/mangoubiubiu/p/15943542.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2021-02-27 @JsonInclude(JsonInclude.Include.NON_EMPTY) 注解无效
2021-02-27 [Vue warn]: Unknown custom element: <el-cascader> - di