文档章节

设计模式-责任链模式

 没懂
发布于 2016/07/29 16:45
字数 784
阅读 9
收藏 0

模式定义:使多个对象都有计划处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

@interface Request: NSObject
@property (nonatomic, copy)NSString *type;
@property (nonatomic, assign)int number;

@end
@implementation Request

@end

@interface Manager : NSObject
@property (nonatomic, copy)NSString *name;
@property (nonatomic, strong)Manager *superior;
@property (nonatomic, strong)Request *req;
- (instancetype)initWithName:(NSString *)name;
- (void)dealRequest:(Request *)request;
@end
@implementation Manager
- (instancetype)initWithName:(NSString *)name
{
    if (self = [super init]) {
        _name = name;
    }
    return self;
}
- (void)dealRequest:(Request *)request
{
    NSException *e = [NSException exceptionWithName:@"override Method dealRequest" reason:@"Must implement dealRequest" userInfo:nil];
    @throw e;
}
@end

@interface LowManger : Manager

@end
@implementation LowManger
-(void)dealRequest:(Request *)request
{
    if ([request.type isEqualToString:@"请假"]&&request.number < 20) {
        NSLog(@"小假,班主任同意了");
    }else
    {
        [self.superior dealRequest:request];
    }
}

@end

@interface MainManger : Manager

@end
@implementation MainManger
-(void)dealRequest:(Request *)request
{
    if ([request.type isEqualToString:@"请假"]&&request.number < 50) {
        NSLog(@"想了一会儿,主任同意了");
    }else
    {
        [self.superior dealRequest:request];
    }
}

@end

@interface DestroyManger : Manager

@end
@implementation DestroyManger
-(void)dealRequest:(Request *)request
{
    if ([request.type isEqualToString:@"请假"]&&request.number < 80) {
        NSLog(@"想了半天,校长同意了");
    }else
    {
        NSLog(@"卧槽,管不了了");
    }
}

@end


int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Request *req = [[Request alloc]init];
        req.type= @"请假";
        req.number = 10;

        // 责任链条
        LowManger *manger = [[LowManger alloc]init];
        MainManger *mainManger = [[MainManger alloc]init];
        DestroyManger *desManger = [[DestroyManger alloc]init];
        manger.superior = mainManger;
        mainManger.superior = desManger;

        [manger dealRequest:req];
        req.number = 30;
        [manger dealRequest:req];
        req.number = 60;
        [manger dealRequest:req];
        req.number = 90;
        [manger dealRequest:req];
    }
    return 0;
}

模式的优点:

 1.请求者和接受者松散耦合

在责任链模式中,请求者并不知道接受者是谁,也不知道具体如何处理请求者只负责向责任链发出请求就可以了,而每个职责对象也不用管请求者或者是其他的职责对象,只负责处理自己的部分,其他的就交给其他的职责对象去处理。也就是说,请求者  和接受者是完全接偶的。

 2.动态组合职责

 责任链模式会把功能处理分散到单独的职责对象中,然后在使用的时候,就可以动态组合职责形成职责链,从而可以灵活地给对象分配职责,也可以灵活地实现和改变对象的职责。

模式的缺点:

 1.产生许多细粒度对象

 责任链模式会把功能处理分散到单独的职责对象中,也就是每个职责对象处理一个方面的功能,要把一个业务处理完,需要许多职责对象的组合,这样会产生大量的细粒度职责对象。

2.不一定能被处理

 责任链模式的每个职责对象只负责处理自己处理的那部分,因此可能会出现某个请求,把整个责任链传递完也没有职责对象处理它。这就需要在使用责任链的时候,需要提供默认的处理,并且注意构建链的有效性

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 8
码字总数 4915
作品 0
徐汇
Tomcat 系统架构与设计模式_ 设计模式分析

门面设计模式 门面设计模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中、Standard Wrapper 到 ServletConfig 封装中、ApplicationContext 到 ServletContext 封装中等都用到...

lvzjane
2014/11/03
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

创建第一个react项目

sudo npm i -g create-react-app@1.5.2 create-react-app react-app cd react-apprm -rf package-lock.jsonrm -rf node_modules #主要是为了避免报错npm installnpm start......

lilugirl
今天
3
0
在浏览器中进行深度学习:TensorFlow.js (八)生成对抗网络 (GAN)

Generative Adversarial Network 是深度学习中非常有趣的一种方法。GAN最早源自Ian Goodfellow的这篇论文。LeCun对GAN给出了极高的评价: “There are many interesting recent development...

naughty
今天
0
0
搬瓦工镜像站bwh1.net被DNS污染,国内打不开搬瓦工官网

今天下午(2018年10月17日),继搬瓦工主域名bandwagonhost.com被污染后,这个国内的镜像地址bwh1.net也被墙了。那么目前应该怎么访问搬瓦工官网呢? 消息来源:搬瓦工优惠网->搬瓦工镜像站b...

flyzy2005
今天
9
0
SpringBoot自动配置

本篇介绍下,如何通过springboot的自动配置,将公司项目内的依赖jar,不需要扫描路径,依赖jar的情况下,就能将jar内配置了@configuration注解的类,创建到IOC里面 介绍下开发环境 JDK版本1.8 spr...

贺小五
今天
5
0
命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部