ITKeyword,专注技术干货聚合推荐

注册 | 登录

ios开发中的基本设计模式(代理,观察者,MVC,单例,策略,工厂,MVVM,原型,Target-Action,通知(notification)机制)

BaiHuaXiu123 分享于 2016-03-12

2019阿里云双12.12最低价产品入口(新老用户均可),
地址https://www.aliyun.com/minisite/goods

(一)代理模式

应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。

优势:解耦合
敏捷原则:开放-封闭原则
实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求。
列表row个数delegate
自定义的delegate


实例参考:
http://blog.csdn.net/baihuaxiu123/article/details/49871681

(二)观察者模式

应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息。

优势:解耦合
敏捷原则:接口隔离原则,开放-封闭原则
实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。
kvo,键值对改变通知的观察者,平时基本没用过。

model.h

@interface model : NSObject
@property(nonatomic,strong)NSString *stockName;
@property(nonatomic,assign)float price;
@end

viewController.m

#import "ViewController.h"
#import "model.h"
@interface ViewController ()
@property(nonatomic,strong)model *M;
@property(nonatomic,strong)UILabel *lab;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.M = [[model alloc]init];
    //[self.M setValue:@"A股" forKey:@"stockName"];
    self.M.stockName =@"A股";
    self.M.price = 13;
    [self.M addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
   _lab = [[UILabel alloc]initWithFrame:CGRectMake(100, 200, 200, 30)];
    _lab.backgroundColor = [UIColor redColor];
    UIButton *but = [[UIButton alloc]initWithFrame:CGRectMake(150, 300, 100, 100)];
    but.backgroundColor = [UIColor orangeColor];
    [but addTarget:self action:@selector(putValue) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:but];
    [self.view addSubview:self.lab];
}
-(void)putValue{
     NSLog(@"111");
    self.M.price = 12.5;
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    for (id k in change) {
        NSLog(@"k----%@",k);

    }
    NSLog(@"context---%@",context);
       if([keyPath isEqualToString:@"price"])
    {
        NSLog(@"asvcsdfvb");
        self.lab.text = [NSString stringWithFormat:@"%f",self.M.price];
    }

}
-(void)dealloc{
   [self.M removeObserver:self forKeyPath:@"price"];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

(三)MVC模式

应用场景:是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。

优势:使系统,层次清晰,职责分明,易于维护
敏捷原则:对扩展开放-对修改封闭
实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。




(四)单例模式




应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。





优势:使用简单,延时求值,易于跨模块
敏捷原则:单一职责原则
实例:[UIApplication sharedApplication]。
注意事项:确保使用者只能通过 getInstance方法才能获得,单例类的唯一实例。
java,C++中使其没有公有构造函数,私有化并覆盖其构造函数。
object c中,重写allocWithZone方法,保证即使用户用 alloc方法直接创建单例类的实例,
返回的也只是此单例类的唯一静态变量。







 如:

UIApplication类提供了 +sharedAPplication方法创建和获取UIApplication单例
NSBundle类提供了 +mainBunle方法获取NSBundle单例
NSFileManager类提供了 +defaultManager方法创建和获得NSFileManager单例。(PS:有些时候我们得放弃使用单例模式,使用-init方法去实现一个新的实例,比如使用委托时)
NSNotificationCenter提供了 +defaultCenter方法创建和获取NSNotificationCenter单例(PS:该类还遵循了另一个重要的设计模式:观察者模式)
NSUserDefaults类提供了 +defaultUserDefaults方法去创建和获取NSUserDefaults单例

//Singleton.h
@interface Singleton : NSObject
+ (Singleton *)sharedSingleton;
@end

/***************************************************************/

//Singleton.m
#import "Singleton.h"
@implementation Singleton 
static Singleton *sharedSingleton = nil;

+ (Singleton *)sharedSingleton{
    static dispatch_once_t once;
    dispatch_once(&once,^{
        sharedSingleton = [[self alloc] init];
        //dosometing
    });
    return sharedSingleton;
}






 (五)策略模式






应用场景:定义算法族,封装起来,使他们之间可以相互替换。
优势:使算法的变化独立于使用算法的用户
敏捷原则:接口隔离原则;多用组合,少用继承;针对接口编程,而非实现。







实例:排序算法,NSArray的sortedArrayUsingSelector;经典的鸭子会叫,会飞案例。







注意事项:






1,剥离类中易于变化的行为,通过组合的方式嵌入抽象基类







2,变化的行为抽象基类为,所有可变变化的父类







3,用户类的最终实例,通过注入行为实例的方式,设定易变行为
防止了继承行为方式,导致无关行为污染子类。完成了策略封装和可替换性。








代码参考:http://blog.csdn.net/baihuaxiu123/article/details/50830418













(六)工厂模式







应用场景:工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。








优势:易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。

代码参考:http://blog.csdn.net/baihuaxiu123/article/details/50773679

(七)MVVM模式
MVVM模式是Model-View-ViewMode模式的简称。由视图(View)、视图模型(ViewModel)、模型(Model)三部分组成,结构如下图。通过这三部分实现UI逻辑、呈现逻辑和状态控制、数据与业务逻辑的分离。
这里写图片描述
使用MVVM模式有几大好处:
  1. 低耦合。View可以独立于Model变化和修改,一个ViewModel可以绑定到不同的View上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
  2. 可重用性。可以把一些视图的逻辑放在ViewModel里面,让很多View重用这段视图逻辑。
  3. 独立开发。开发人员可以专注与业务逻辑和数据的开发(ViewModel)。设计人员可以专注于界面(View)的设计。
  4. 可测试性。可以针对ViewModel来对界面(View)进行测试
代码参考:http://blog.csdn.net/baihuaxiu123/article/details/50755403

(八)原型模式
理解:原型模式属于创建型模式,与工厂,单件,生成器模式有相似点,就是创建对象,而原型模式最大的特点就是对一个基类对象进行克隆复制创建出模型一样的副本,进行操作。
代码参考:http://blog.csdn.net/baihuaxiu123/article/details/50830418

(九)Target-Action模式
目标-行为(Target-Action)模式(目的在于让代码解耦合,使代码与代码之间关联性降低,便于后期开发维护)
Target-action—-这个设计模式用按钮,等控件把用户的交互变成代码,让程序可以执行;
Target-action :通俗易懂的说也就是
一个对象包含一些生成一个消息表达式的元素,当一个确定事件出现时,把这些元素放到一起组成消息和发送这个消息。
参考代码:http://blog.csdn.net/baihuaxiu123/article/details/50061169

(十一)通知(notification)机制
在通知机制中对某个通知感兴趣的所有对象都可以成为接受者。首先,这些对象需要向通知中心(NSNotificationCenter)发出addObserver:selector:name:object:消息进行注册,在投送对象投送通知送给通知中心时,通知中心就会把通知广播给注册过的接受者。所有的接受者不知道通知是谁投送的,不去关心它的细节。投送对象和接受者是一对多的关系。接受者如果对通知不再关注,会给通知中心发送removeObserver:name:Object:消息解除注册,以后不再接受通知

下载地址:http://pan.baidu.com/s/1nujo8tF

(一)代理模式
 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。
 优势:解耦合
敏捷原则:开放-封闭原则
实例:tableview的 数据源delegate,通过和proto

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。