【开闭原则】

2023-05-16

## 开闭原则(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 提供的接口来 实现自己的功能)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【开闭原则】 的相关文章

随机推荐