iOS设计模式系列(一)

2018-07-12  本文已影响0人  James_Gong

设计模式

什么是设计模式?
设计模式是一个比较抽象的概念,但是又是实实在在存在的.设计模式,可以让项目的可维护性更好,它可以很方便的用来解决大型项目里面存在的一些问题.它是为解决特定场景下的问题而定制的解决方案.

那么设计模式是怎么来的呢?
软件开发的过程中,我们一般都会面临一系列的问题.比如:我们我们写的一些代码,在后面的业务变更中,可能要对这些代码里面的类或者是模块,要进行扩展或者修改.那么我们用什么样的办法,可以使我们的代码修改起来容易呢? 所以针对这样的问题,前辈们早就已经做了大量的实践方案对它进行验证了.也就是大家都认可的方案,那么这些方案后面就变成了现在的设计模式.
设计模式的概念是相同的.不管是iOS系统还是安卓系统或者是其它的系统,都会用到这些通用的设计模式去解决一些问题.

在开发中,没有固定的一种设计模式去解决所有的问题.每种模式只是针对特定问题的解决方案,所以不要迷信设计模式,滥用设计模式.

设计模式的基本原则

设计模式有七大原则:
1.单一原则
一个类只负责一个功能领域中的相应职责.简单说:一个类负责一项职责. 这个原则的话,我们不学这设计模式,在开发中也都是这么用的.如:你写了个详情页面的model类,那么这个model类就只写你详情页面上的属性.

2.开闭原则
类、模块和函数应该对扩展开放,对修改关闭。模块应尽量在不修改原代码的情况下进行扩展。
对扩展开放: 当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为
对于修改是关闭:对模块行为进行扩展时,不必改动模块的源代码或者二进制代码.

3.里氏替换原则
任何基类可以出现的地方,子类一定可以出现
子类父类可以相互替换,子类可以用父类所有的方法.父类也可以用子类所有的, 彼此没区别

4.依赖倒转原则
抽象不依赖于细节,细节依赖于抽象.指的是接口,我们在给一个类设计接口的时候, 会用到依赖倒转原则

5.接口隔离原则
指的是在代码的接口里面,接口里面只做必要的事情,不要做其他无关的事情.在开发中很重要,严格遵守, 那么会使源码复用性很高.

6.合成/聚合复用原则
可以将已有的对象纳入到新对象中,使之成为新对象的一部分,因此新的对象可以调用已有对象的功能

7.最小知识原则

两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用 image.png

简单案例来巩固下我们的这些原则

这个案例是用来解释接口隔离原则,开闭原则,以及里氏代换原则.

在BaseView中有一个改变按钮的Frame.因为其它的需求不需要,只需要一个frame的参数确定按钮大小就行.只做必要的事情,这个就叫做接口隔离原则. image.png 如果我在这里再加一个方法,改按钮背景色的方法,但是我需求里面用不到.这就违背了接口隔离的原则了. image.png

开闭原则又是怎么回事呢?模块对扩展开放,对修改关闭.
假如我刚刚写的baseView在其它的模块里面都用到了的话,这个时候,要修改或者是扩展它,那应该怎么做?
从开闭原则这里来举例的话,我们直接新建一个类,来继承它, 并且在这个里面进行扩展.

我们这里创建一个FirstView,在这个类里面添加扩展的属性以及扩展出的方法 image.png 将这个类进行实现就行了, baseView里面的在这里重写这两个方法就行 image.png

这里讲的开闭原则, 开是对扩展开放. 它对修改是关闭的. 也就是说我们baseView里面的方法和属性, 我们是不能删除的.因为它可能会影响到其他地方的代码出现问题.

里氏代换原则(LSP)讲的是什么意思呢? 它主要讲的是父类和子类的方法,跟我们的多态差不多.
里氏替换原则要求我们的父类它必须提供尽可能多的接口,来供我们的子类来加载.

所以像我们用的FirstView的话,它是不属于这个里氏代换原则的.因为它在.h里面都提供了给外面调用的接口. image.png 新建一个类SecondView来说明这个问题 image.png 把fistView中的代码拷贝到我们的baseView中.也就是父类里面尽可能多的提取出接口和抽象方法. image.png

接着我们在SecondView中, 实现父类提供的抽象方法就行了.当然在SecondView中也可以写私有的方法,但是私有的方法,不能暴露接口在它的.h里面.如果暴露出来就破坏了它的封装性.
这里有一个点需要注意,里氏替换原则跟多态差不多.里氏替换原则要求子类避免重写父类方法,而多态的条件之一是: 要求子类重写父类的方法。这是他们的区别.

上一篇下一篇

猜你喜欢

热点阅读