文档章节

设计模式-责任链模式

 没懂
发布于 2016/07/29 16:45
字数 784
阅读 9
收藏 0
点赞 0
评论 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
徐汇
设计模式Java Design Pattern-工厂方法模式FactoryMethod

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

勇敢写信 ⋅ 03/22 ⋅ 0

你需要了解的23种JavaScript设计模式

为什么要学习设计模式? 在许多访谈中,你可能会遇到很多面向对象编程中的接口,抽象类,代理和以及其他与设计模式相关的问题。 一旦了解了设计模式,它会让你轻松应对任何访谈,并可以在你的...

java高级架构牛人 ⋅ 06/02 ⋅ 0

Dubbo源码分析(2),Dubbo中采用的设计模式

1、工厂模式 ServiceConfig中有个字段,代码是这样的: Dubbo里有很多这种代码。这也是一种工厂模式,只是实现类的获取采用了jdkspi的机制。这么实现的优点是可扩展性强,想要扩展实现,只需...

郑加威 ⋅ 03/18 ⋅ 0

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

JDK1.8 使用Lambda重构设计模式

策略模式 策略模式 简言之:一个接口,多种实现。使用时进行选择。 不使用Lambda重构 使用Lambda重构后: 模板方法 基于抽象方法,在抽象类实现 详见本博客:https://my.oschina.net/u/34187...

Lien6o ⋅ 03/17 ⋅ 0

设计模式分类与原则

创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(...

晨猫 ⋅ 03/12 ⋅ 0

Java经典设计模式基础

一、概况 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 (2)结构型模式,共七种:适配器模式、装饰器模式、代理...

Idea ⋅ 01/20 ⋅ 0

[设计模式]简单工厂模式

简介 简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。 简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例。 简单工厂模式是一...

静默虚空 ⋅ 2015/06/03 ⋅ 0

C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 35分钟前 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 52分钟前 ⋅ 0

001. 深入JVM学习—Java运行流程

1. Java运行流程图 2. Java运行时数据区 3. Java虚拟机栈 栈内存是线程私有的,其生命周期和线程相同; 虚拟机栈描述的是Java方法执行的内存模型:执行一个方法时会产生一个栈帧随后将其保存...

影狼 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

mysql的分区和分表

1,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一...

梦梦阁 ⋅ 今天 ⋅ 0

exception.ZuulException: Forwarding error

错误日志 com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: xxx timed-out and no fallback available. Ca......

jack_peng ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部