iOS 之 责任链模式详解

来源:互联网 发布:c语言 stdio 编辑:程序博客网 时间:2024/06/03 14:20

 设计模式在实际编程中对遇到的问题解决方案的抽象,也就是每一个设计模式都在编程实例中有体现

 责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。

具体的请看 代码实例 由于写的比较 仓促 类的名字 命名不太规范

1. 首先创建 一个协议继承NSObject

#import <Foundation/Foundation.h>

@protocol AllProtocol <NSObject>
// 设置继任者
-(void)setSuccessor:(id<AllProtocol>)successor;
//获取继任者
- (id<AllProtocol>)successor;
//处理请求
- (void)handleRequest:(id)request;

@end

2. 创建三个类 每个类遵循这个协议 例如

在 .h 文件中

#import <Foundation/Foundation.h>
#import "AllProtocol.h"
@interface Person : NSObject<AllProtocol>
@end


person类

在Person.h进行实现协议

#import "Person.h"

@interface Person ()
//进行了强引用也可以使用weak
@property (nonatomic,strong) id<AllProtocol>nextsucessor;

@end

@implementation Person

// 设置继任者
-(void)setSuccessor:(id<AllProtocol>)successor{
    self.nextsucessor = successor;
    
}
//获取继任者
- (id<AllProtocol>)successor{
    
    return self.nextsucessor;
    
}
//处理请求
- (void)handleRequest:(id)request{
    
    NSString *string =request;
    
    BOOL isMake = [string isEqualToString:@"胖子"];
    
    if(isMake==NO){
        
        [self.nextsucessor handleRequest:string];
        
    }else{
        NSLog(@"是胖子");
    }  
}

@end

Whrite类

#import "Whrite.h"


@interface Whrite ()

@property (nonatomic,strong) id<AllProtocol> nextSuccessor;

@end

@implementation Whrite


// 设置继任者
-(void)setSuccessor:(id<AllProtocol>)successor{
    
    
    self.nextSuccessor = successor;
    
}
//获取继任者
- (id<AllProtocol>)successor{
    
    return self.nextSuccessor; 
}
//处理请求
- (void)handleRequest:(id)request{
    NSString *string = request;
    
    BOOL isBai = [string isEqualToString:@"白"];
    if ( isBai==NO) { 
        [self.nextSuccessor handleRequest:string];
    }else{
        
        NSLog(@"是白"); 
    }  
}
@end

Page 类

#import "Page.h"

@interface Page ()

@property (nonatomic,strong)id<AllProtocol> nextSuccessor;

@end

@implementation Page
// 设置继任者
-(void)setSuccessor:(id<AllProtocol>)successor{
    self.nextSuccessor = successor;
 }
//获取继任者
- (id<AllProtocol>)successor{
    
    return self.nextSuccessor;
}
//处理请求
- (void)handleRequest:(id)request{
    
    NSString *string = request;
  BOOL isPag = [string isEqualToString:@"狗"];
    if(isPag ==NO){
        [self.nextSuccessor handleRequest:string];
        
        
        
    }else{
        NSLog(@"%@",string);    
    }
      
}

@end

由于是链接模式 都需要一个结点下面 我们来创建一个结点里面实现的方法跟其他类一样 不需要做任何的操作

#import "Handel.h"

@interface Handel ()

@property (nonatomic,strong)id<AllProtocol> nextSuccessor;
@end

@implementation Handel

// 设置继任者
-(void)setSuccessor:(id<AllProtocol>)successor{
    
    self.nextSuccessor = successor;
    
}
//获取继任者
- (id<AllProtocol>)successor{
    return self.nextSuccessor;
}
//处理请求
- (void)handleRequest:(id)request{
    
    [self.nextSuccessor handleRequest:request];
    
}


@end

在viewController 的进行实现下 ,实际就是进行链表的链接

#import "ViewController.h"
#import "Person.h"
#import "Handel.h"
#import "Whrite.h"
#import "Page.h"

@interface ViewController ()
@property (nonatomic,strong)Handel *hadle;
@property (nonatomic,strong)Person *person;
@property (nonatomic,strong)Page *pag;
@property (nonatomic,strong)Whrite *whrite;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor =[UIColor whiteColor];
    self.hadle = [Handel new];
    self.person = [Person new];
    self.pag = [Page new];

    self.whrite = [Whrite new];
    
    self.hadle.successor =self.person;
    self.person.successor = self.pag;
    self.pag.successor =self.whrite;
    
    [self.hadle handleRequest:@"胖子"];
    
    
}

运行结果:

016-03-23 10:30:51.770 责任链模式[9183:91620] 是胖子

[self.hadle handleRequest:@"白"];

运行结果:

2016-03-23 11:10:50.023 责任链模式[11598:115485] 是白

责任链模式 把一个职能分解处理 ,在实际运用的过程中我们可以进行类别的分配,上面的例子只是简单地实现的一下,当传递的消息被处理以后,就会中断,被请求处理的时件 不会走完整个责任链,如果想让把这条责任链走完,你可以在判断的时候,无论事件 是否成立都让数据处理链条进行传递下去。





0 0
原创粉丝点击