00:00
好,我们来看一下,根据开闭原则,我们应该怎样去修改方式一的这么一段代码。思路其实特别的简单哈,就是我们把我们创建一个sharp类,做一个抽象类,就是把这个ship。Shape这个类呢,我们把它做成一个抽象类,并且呢,我们提供一个抽象的方法叫做然后让子类,这个子类就是刚才我们写的像这个。啊,Rectangle,还有circle,还有triangle,像这种三角形,圆形、矩形,我们要去继承这个ship。那么继成这个图形以后,我们干什么呢?我们只需大家看这里。我们只需要让新的这个类区继承它,然后把这个draw这个方法实现就可以了,那这个时候我们在使用方的代码呢,就无需修改。那是不是这样子的呢?来,我们一起把这个代码给大家完成一下来吧。
01:04
呃,来这样子做,我们在这一个OCP下面呢,我们新建一个包,对吧,新建一个新建一个包叫改进。Improve。然后在这里面呢,为了省点事,我们把原先的代码先拷贝一份过来。就在这个代码上我们进行一个修改,那刚才已经讲过了哈,首先我们说了这个类呢,我们把它做成一个抽象的类。他仍然是做以鸡肋,这个没问题,我写一个abstract。Abstract,然后在这里我们提供一个方法,是一个抽象的方法,比如说我写一个抽象方法。往下拉,我们就写一个public。Public abstract。Voidra。对吧,这个方法呢,我们是个抽象的抽象。
02:01
方法没问题,那大家看到REC REC rectangle这个呢,它继承了信,他继承过后呢,我们显然要把这个造方法呢给实现一把,这个没问题,我们实现,实现过后我们在这里面写一句话。来,我们写一句怎样的话呢,我们就说绘制对吧,绘制什么呢,句型。完事,同样的道理。这个圆形就circle呢,也像这样相应的做一把,我复制一份。然后把这个地方改成绘制什么呀,圆形。完事,然后呢,这边也是一样的道理。复制一份,然后把这边改成绘制三角形。代码写完,那这样写完以后我们。这一个。Gray edit呢,我们也要做一个改进,也就是说这个时候这三个方法我们就。不要了。
03:00
不要了,我们让子类去实现这个做方法,那在这里这个还需要吗?我们这里面一系列的一副钥匙分支判断也不需要了,我们直接调用S点做。完事,你看这个代码呢,就显得比较简洁。显得比较简洁,来,我们来看一看,此时此刻,当我们这样处理过后,代码能不能正确的运行起来,来,跑一个。OK。同学们可以看到现在代码仍然是没有问题的,绘制矩形、圆形、三角形,那现在如果我们在这种代码就是满足OCP原则的。这种方案上我们新加一个图形的绘制是不是就变得变简单一些呢?显然可以来我们来在地方新增一个新的图形,新增。一个图形,比如说我们画的是一个其他图形吧,Class other。
04:00
对吧,Other别的别的一个官。我就简写啊gray。PE gray。我们画一个一个新的其他的图形,就是其他图形呢,我们都放到这里。然后我们仍然去继承这个。这个什么呢?She把这个图形继承下来,继承下来过后,我们也按照刚原先的这个套路,比如说。这一个其他的图形呢,我们把它的类型定为几呢?定为四。没问题吧,然后我们也去实现这个造方法,然后写上一句话。怎么写呢?我们叫做绘制其他图形。对吧,绘制。绘制其他图形。代码写完那。这个时候你们有发现我们新增加一个功能,对于扩展它是开放的。
05:02
那么这个地方在使用使用方。这个graph editor我们不需要改变,就不需要修改,我们这个时候就可以用了,大家看graph edit。Gray。Editor。点做我们一个图形又一个other。别的图形,那这个时候我们可以看到,我们只需要扩展一个类,然后就可以去使用了,而对于使用方,我们没有去做任何改变。对吧,所以说这个时候呢,接收这个图形,然后调用。调用什么呢?调用这个造方法就可以了。好,我们运行一把,我们看代码能否正确的运行起来,同学们可以看到没有任何问题,好,这样的呢,就满足了我们OCP的这样一个原则。这就是我们的一个解决方案,这个就是一个就是我们解决方案,同学们还记不记得我们在前面在讲哪一个原则的时候也用到了,也也是跟这个非常像的,大家还记得吗?是不是在讲?
06:10
在讲理事,是不是理事替换啊?哦,不是,这是在讲哪个呢?这在讲这个依赖。依赖倒倒转的时候,大家有没有发现我们这也用了它用接口来实现的,对不对,也是这样子的,再比如说我们在前面讲这个单一原则的时候,大家还记不记得我们这是用一个接口来处理的,比如说在单一原则。单一原则,我们这儿是在这个地方,大家有没有发现我们这设计了一个接口?这调了一个接口给他,我们看是在哪里写的。啊,不是,这是在。我看是在哪里写的哈。是在你发消息是在哪里发的。不是这对吧,不是这儿。
07:01
一来反转。啊,对,是这个地方。这方我们叫做依赖倒转的时候,大家有发现我们这个地方使用方是person,这个person里面呢,它接收一个接口,看到没有,其实这个地方跟我们刚才这个案例很像。为什么呢?因为当我们去增加一个新的接收方式的时候,我们使用方是不需要改变的。是不是一样的道理,你看我们增加一个新的微信,实现了这个I receive这个接口,把方法,把这个接口里面的方法。给实现了过后,那我们在使用方是不需要变化的,其实这也是一个经典的满足OCP原则的一个设计方案。好的同学们,那关于这个开辟原则呢,开辟原则这块的代码,我们就先聊到这里。
我来说两句