浅谈MVC
MVC是一种视图、模型分离的设计。
其中View、Model、Controller的主要关系由Observe(观察者)、Composite(混合)、Strategy(策略)三个设计模式给出的。
View 支持嵌套视图嵌套,混合视图 Composite View 由原子对象 (UIBottom等)构成,组合对象可以当做一个对象来使用。我们也可以在View中通过协议、block,支持不同的VC实现特定的响应方式。V-C的这种关系就是 Strategy 的一个例子。
Model 的改变可以影响一些对象,但Modle并不需要了解被影响的对象的细节,这种设计被描述成 Observe,在代码中我们通常通过ViewModel,结合RAC、RxSwift框架来实现。
Controller:定义了界面对用户输入的响应方式。比如要实现子视图吸顶效果,就可以通过Strategy模式 ,定义一些接口,吸顶的视图需要继承接口-实现控制vc.view开始、结束响应上下滑动。接口继承的本质就是描述了一个对象什么时候能被用来替代另一个对象。
对象的类class、类型type的区别:
以NSObject为例,NSObject是类,定义了对象的内部状态和操作实现(属性和接口)。Class是类型,NSObject的类型可以通过下面来获得:
Class objectClass = NSClassFromString(@"NSObject");
对象的类型只与接口有关,通常的,我们判断两个对象是否是一个类型,就是通过Class来比较的,比较的就是他的接口,而不是内部的状态。
类继承与接口继承的区别
类继承根据一个对象的实现定义了另一个对象,这就是为什么我们要先调用父类的init。
接口继承 = 协议的“继承”,描述了一个对象什么时候能被另一个对象代替。
@interface MyClass : NSObject
@end
@interface MySubclass : MyClass
@end
@protocol MyProtocol <NSObject>
- (void)myMethod;
@end
@protocol MySubprotocol <MyProtocol>
- (void)myOtherMethod;
@end
抽象类的优点:客户能够直接操作实例而不需要考虑再创建一个实例(接口继承),客户不需要知道对象的特定类型,只需要知道对象有客户期望的接口,抽象类的继承与类的继承的区别就在于你能明确的知道没有隐藏的父类操作
在Object-C中接口继承并没有被广泛的应用,这是因为Object-C中的protocol没有强约束,也就是Option,你无法确定继承了接口的类是否实现了这个方法。并且protocol没有默认实现,如果多个类继承了接口且有相同的实现,就会产生重复代码,如果通过类继承的方式来做默认实现,会增加额外的开销。多继承关系可能会类爆炸。
继承
继承之所以能被广泛使用,就是它几乎无须任何代价,就可以快速定义一个新的对象,并且可以通过继承获得所需要的绝大部分功能。