2.熟练掌握MVC.单例.观察者.代理.工厂等设计模式

2.熟练掌握MVC.单例.观察者.代理.工厂等设计模式_第1张图片

2.1MVC 模式

指的是:模型-视图​-控制

对于界面设计可变性的需求,MVC把交互系统的组成部分分解成模型,视图,控件三种部件。模型会把任何数据的变更通知控制器,然后控制器更新视图数据。视图对象通知控制器用户的操作,控制器要么根据需要来更新模型,要么检索任何被请求的数据。

(1)模型包含了应用问题的核心数据,逻辑关系和计算功能,它封装了所需的数据,提供了完成问题处理的操作过程。

(2)视图通过显示的形式,把信息传达给用户。不同视图通过不同的显示,来表达模型的数据和状态信息。

(3)控制器通过时间触发的方式,接受用户的输入。控制器如何获得事件依赖于界面的运行平台。控制器通过事件处理过程对输入事件进行处理,并为每个输入事件提供了相应的操作服务,把事件转化成对模型或相关视图的激发操作。

优点:

(1)低耦合性

(2)高重用性和可试用性

(3)较低的生命周期成本

(4)可维护性等

注意:

(1)Model和View之间永远不能相互通信,只能通过Controller传递。

(2)Controller可以直接与Model对话(读写调用Model),Model通过Notification(通知)和KVO机制与Controller间接通信。

(3)Controller可以直接与View对话,通过outlet直接操作View,outlet直接对应到View中的控件,View通过action向Controller报告事件的发生(如用户Touch我了)。Controller是View的直接数据源(数据很可能是Controller从Model中取得并经过加工了)。Controller是View的代理(delegate),以同步View与Controller。

2.2​单例模式

单例设计模式确保对于一个给定的类只有一个实例存在,这个实例有一个全局唯一的访问点。它通过采用懒加载的方式在第一次用到实例的时候再去创建它。

iOS中单例模式的应用

iOS中好几个类都是采用了单例模式,比如NSApplication,NSFontManager,NSDocumentController,NSHelpManager,NSNull,NSProcessInfo,NSScriptExecutionContext,NSUserDefaults.

示例​:

+​(MyPlayer *)shareInstance

{

static MyPlayer * my player = nil;

staic dispatch​_once_t onceToken;

dispath_once(&onceToken,^{

myplayer = [[MyPlayer alloc] init];

});

return my player;

}

方法:

1:声明一个静态变量去保存类的实例,确保它在类中的全局可用性。

2:声明一个静态变量dispath_once_t,它确保初始化器代码只执行一次。

3:使用Grand Central Dispath(GCD)执行初始化MyPlayer变量的block,这正是代理模式的关键;一旦类已经被初始化,初始化器永远不会再被调用。

2.3观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。在iOS中观察者模式的实现由三种方法:Notification,KVO以及标准方法。

2.3.1KVO

key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。每次制定的被观察的对象的属性被修改后,KVO自动通知相应的观察者。

2.3.2通知(Notification)

Notification-NotificationCenter机制使用了操作系统的功能。通过NotificationCenter可以让对象之间进行通讯,这些对象相互间可以不认识。当你用一个并行的流来推送通知,或者刷新数据库,并希望在界面中能够看到时,这非常有用。

2.4​代理模式

委托代理。把某个对象要做的事情委托给别的对象去做。那么别的队先后就是这个对象的代理,代替他来打理要做的事情。

2.5​工厂模式

工厂模式即实例化对象,用工厂方法代替new操作,又被称作虚构造器。它的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。一般当你在一个类不知掉它所必须创建的对象的类时或者一个类希望有它的子类决定所创建的对象时,都可以使用工厂方法。

在简单工厂中,产品有一个统一的interface,而可以有不同implementation,同时有一个(通常是仅有一个)工厂对象。需要产品的时候,工厂会根据已有条件做switch,选择一种产品实现,构建一个实例出来。这种设计将产品的抽象和实现分离开来,可以针对统一的产品接口进行通信,而不必特意关注具体实现的不同。对于产品类别的扩充也是可以的,但每增加一个产品,都需要修改工厂的逻辑,有一定的维护成本。

工厂方法更进一步,将工厂也抽象出来,进行接口,实现分离。这样具体工厂和具体产品可以对应着同时扩充,而不需要修改现有逻辑。当然,使用者也许在不同场景要在一定程度上自己对应的工厂选择。

抽象工厂相对于工厂方法主要是对整个产品类的体系进行了横向扩充,构成一个更为完整的系统。

抽象工厂模式和工厂模式的区别

工厂方法模式​:每个抽象产品派生多个具体产品类,每个抽象工厂类派生多个具体工厂类,每个具体工厂类负责一个具体产品的实例创建。

抽象工厂模式:每个抽象产品派生多个具体产品类,每个抽象工厂派生多个具体工厂类,每个具体工厂负责多个具体产品的实力创建

你可能感兴趣的:(2.熟练掌握MVC.单例.观察者.代理.工厂等设计模式)