文档章节

设计模式-责任链模式

 没懂
发布于 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
设计模式 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
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
03/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spark core基础

Spark RDD的五大特性 RDD是由一系列的Partition组成的,如果Spark计算的数据是在HDFS上那么partition个数是与block数一致(大多数情况) RDD是有一系列的依赖关系,有利于Spark计算的容错 RDD中每...

张泽立
33分钟前
0
0
如何搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已...

Java大蜗牛
48分钟前
0
0
ffplay 播放 rtsp地址

D:\ffmpeg\ffmpeg\bin ffplay.exe 播放rtsp地址: ffplay.exe -rtsp_transport tcp "rtsp://ip:port/pag://172.16.0.11:7302:33000000001310001748:1:SUB:TCP?cnid=2&pnid=2&auth=50&streamf......

yizhichao
53分钟前
3
0
[Jekyll] permalink -- 修改文章的链接地址

在我的个人博客中访问这篇文章时,你有注意到地址栏中显示的地址吗?它应该是这样的: https://cometeme.github.io/jekyll/2018/08/Jekyll-为文章设置永久链接.html 。打开其他的文章,可以看...

cometeme
54分钟前
0
0
启动mango数据库批处理

::启动mango数据库set dbdir=c:\mongodb\dataif not exist %dbdir% md %dbdir%c:cd c:\mongodbmongod.exe --dbpath %dbdir%...

江湖令
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部