## 开闭原则(Open Close Principle)
开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点
* 举个例子:果农要种树,浇水,收货
种了两种水果:苹果和梨
先创建一个干活的接口
```
interface Fruit {
fun plant()
fun watering()
fun pluck()
}
```
然后苹果和梨都实现这个接口
```
class Apple:Fruit {
override fun plant() {
println("Apple:plant")
}
override fun watering() {
println("Apple:watering")
}
override fun pluck() {
println("Apple:pluck")
}
}
class Pear :Fruit{
override fun plant() {
println("Pear:plant")
}
override fun watering() {
println("Pear:watering")
}
override fun pluck() {
println("Pear:pluck")
}
}
```
农民伯伯开始干活:
```
open class Farmer :Fruit{
private var apple:Apple? = null
private var pear: Pear? = null
fun initFruit(){
apple = Apple()
pear = Pear()
}
override fun plant() {
apple!!.plant()
pear!!.plant()
}
override fun watering() {
apple!!.watering()
pear!!.watering()
}
override fun pluck() {
apple!!.pluck()
pear!!.pluck()
}
}
```
随着年龄增长农民伯伯不再亲力亲为了,事情都交给儿子打理;那么问题来了,儿子觉得父亲干活不精细需要改一下步骤
这样的话需要既能新增功能又不改变自己
可以考虑使用继承方式,既保证原始基础工作不变子类实现新的流程
```
class FarmerSon :Farmer(){
override fun plant() {
println("种植前,除草")
super.plant()
}
override fun watering() {
println("浇水前,施肥")
super.watering()
}
override fun pluck() {
println("采摘前,清理果地")
super.pluck()
}
}
```
调用方式不变
```
fun main() {
// val farmer =Farmer()
// farmer.initFruit()
// farmer.plant()
// farmer.watering()
// farmer.pluck()
val farmerSon = FarmerSon()
farmerSon.initFruit()
farmerSon.plant()
farmerSon.watering()
farmerSon.pluck()
}
```
开闭原则,提高复用性,提高了可维护性(Spring AOP里 也是类似的 并不是通过修改Spring 源码 而是通过 扩展 重写Spring 提供的接口来 实现自己的功能)