文章目录
- 一、定义
- 二、开闭原则分析
- 三、示例1
-
- 1.存在问题
- 2.开闭原则重构
- 四、示例2
-
- 1.存在问题
- 2.重构
- 五、总结
一、定义
??一个软件实体应当对扩展开放,对修改关闭。
??也就是说在设计 一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即在不修改源代码的情况下改变这个模块的行为。
二、开闭原则分析
??(1)开闭原则是面向对象设计中最重要的原则之一。
??在开闭原则的定义中,软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
??(2)抽象化是开闭原则的关键。抽象化就是将一个类(实体)里面或者多个类里面公共的东西抽取出来,抽象的好处就是稳定的、可靠的、不容易发生改变的。
??开闭原则还可以通过一个更加具体的 “可变性封装原则” 来描述,对可变性封装原则要求找到系统的可变因素并将其封装起来。
与信息隐藏原则有些类似,信息隐藏原则有两个:一个是隐藏复杂的东西,另一个是隐藏可变的东西。
三、示例1
1.存在问题
2.开闭原则重构
??按照前面的方法,那么它违背了开闭原则。接下来就用开闭原则进行重构。
??(1)解决问题的思路:抽象化是开闭原则的关键,开闭原则要将可变的东西进行封装,将可变的东西进行封装变成稳定东西。
??(2)找出可变点,在这里可变的就是按钮的形状,所以需要将它稳定下来,也就是进行抽象化,封装。
??如果需求发生改变,要使用其他类型的按钮,只需要继承 AbstractButton 类就行。
如下图
??(3)还有一个问题:display() 显示 LoginForm 的时候按钮从哪里取呢,按钮的形状是变化的,这时候要额外增加一个文件(config.xml)。config.xml 文件里面增加一个节点叫做 ,在这个节点里标注出来 LoginForm 使用的是哪种类型的按钮。
??这里也起到了一个隔离的作用,把变化的东西移到第三方的配置文件里面,在配置文件里指出使用的是哪种。
??当 LoginForm 调用 display() 时,display() 可以读取配置文件进行初始化。
??如果需求发生改变,打开配置文件,将按钮的名称改好就可以,这样也是不修改源代码的。
1.存在问题
??上面是一般传统的做法,但是这个做法也是有问题的,当需求发生变化时,要修改源代码。

??抽象化是开闭原则的关键
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!