美文网首页23种设计模式
23种设计模式(十)

23种设计模式(十)

作者: 刀客传奇 | 来源:发表于2017-04-29 11:42 被阅读59次

版本记录

版本号 时间
V1.0 2017.04.29

前言

前面讲了23种设计模式中的前几个,下面我们继续,先看前几篇文章。
1. 23种设计模式(一)
2. 23种设计模式(二)
3. 23种设计模式(三)
4. 23种设计模式(四)
5. 23种设计模式(五)
6. 23种设计模式(六)
7. 23种设计模式(七)
8. 23种设计模式(八)
9. 23种设计模式(九)

详述

十九、职责链模式——Chain of Responsibility

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链传递该请求,直到有一个对象处理它为止。先看一下原理图。

职责链模式原理图

看代码组织结构。

代码组织结构

看代码。

1. ViewController.m

#import "ViewController.h"
#import "HCDMnager.h"
#import "HCDCommonManager.h"
#import "HCDMajorManager.h"
#import "HCDGenaralManager.h"
#import "HCDReuquest.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    HCDCommonManager *common = [[HCDCommonManager alloc]initWithName:@"猪经理"];
    HCDMajorManager *majon = [[HCDMajorManager alloc]initWithName:@"狗总监"];
    HCDGenaralManager *genaral = [[HCDGenaralManager alloc]initWithName:@"蛤蟆总经理"];
    common.superior = majon;
    majon.superior = genaral;
    
    HCDReuquest *request = [[HCDReuquest alloc]init];
    request.requestType = @"请假";
    request.number = 5;
    [common dealRequest:request];
    
    request.number = 20;
    [common dealRequest:request];
    
    request.number = 220;
    [common dealRequest:request];
    
    request.number = 1200;
    [common dealRequest:request];
}

@end

2. HCDMnager.h
#import <Foundation/Foundation.h>

@class HCDMnager,HCDReuquest;

@interface HCDMnager : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, strong) HCDMnager *superior;

- (instancetype)initWithName:(NSString *)name;

- (void)dealRequest:(HCDReuquest *)request;

@end


3. HCDMnager.m
#import "HCDMnager.h"
#import "HCDReuquest.h"

@implementation HCDMnager

- (instancetype)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        _name = name;
    }
    return self;
}

- (void)dealRequest:(HCDReuquest *)request
{
    
}

@end

4. HCDReuquest.h

#import <Foundation/Foundation.h>

@interface HCDReuquest : NSObject

@property (nonatomic, copy) NSString *requestType;
@property (nonatomic, assign) NSInteger number;

@end

5. HCDReuquest.m
#import "HCDReuquest.h"

@implementation HCDReuquest

@end


6. HCDCommonManager.h

#import "HCDMnager.h"

@interface HCDCommonManager : HCDMnager

@end


7. HCDCommonManager.m

#import "HCDCommonManager.h"
#import "HCDReuquest.h"

@implementation HCDCommonManager

- (void)dealRequest:(HCDReuquest *)request
{
    if ([request.requestType isEqualToString:@"请假"] && request.number < 10) {
        NSLog(@"%@处理了%@,时间是%ld",self.name,request.requestType,request.number);
    }
    else{
        [self.superior dealRequest:request];
    }
}

@end


8. HCDMajorManager.h

#import "HCDMnager.h"

@interface HCDMajorManager : HCDMnager

@end


9. HCDMajorManager.m
#import "HCDMajorManager.h"
#import "HCDReuquest.h"

@implementation HCDMajorManager

- (void)dealRequest:(HCDReuquest *)request
{
    if ([request.requestType isEqualToString:@"请假"] && request.number < 50) {
        NSLog(@"%@处理了%@,时间是%ld",self.name,request.requestType,request.number);
    }
    else{
        [self.superior dealRequest:request];
    }
}

@end


10. HCDGenaralManager.h

#import "HCDMnager.h"

@interface HCDGenaralManager : HCDMnager

@end


11. HCDGenaralManager.m
#import "HCDGenaralManager.h"
#import "HCDReuquest.h"

@implementation HCDGenaralManager

- (void)dealRequest:(HCDReuquest *)request
{
    if ([request.requestType isEqualToString:@"请假"] && request.number < 500) {
        NSLog(@"%@处理了%@,时间是%ld",self.name,request.requestType,request.number);
    }
    else{
        NSLog(@"%@不同意%@,时间是%ld",self.name,request.requestType,request.number);
    }
}

@end

看结果。

2017-04-29 10:58:55.169 19职责链模式[1184:25440] 猪经理处理了请假,时间是5
2017-04-29 10:58:55.170 19职责链模式[1184:25440] 狗总监处理了请假,时间是20
2017-04-29 10:58:55.170 19职责链模式[1184:25440] 蛤蟆总经理处理了请假,时间是220
2017-04-29 10:58:55.170 19职责链模式[1184:25440] 蛤蟆总经理不同意请假,时间是1200

结论:思想。


二十、中介者模式——Mediator

  用一个中介对象来封装一系列的对象交互,中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。先看一下原理示例图。

中介者模式示例图

下面看一下代码结构图。

中介者模式代码组织结构

下面看代码。

1. ViewController.m

#import "ViewController.h"
#import "HCDColleagueA.h"
#import "HCDColleagueB.h"
#import "HCDAbstractMediator.h"
#import "HCDMediator.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    HCDAbstractColleague *colleagueA = [[HCDColleagueA alloc]init];
    HCDAbstractColleague *colleagueB = [[HCDColleagueB alloc]init];
    
    HCDAbstractMediator *mediator = [[HCDMediator alloc]initWithColleagueA:colleagueA colleagueB:colleagueB];
    colleagueA.mediator = mediator;
    colleagueB.mediator = mediator;
    
    colleagueA.number = 1450;
    colleagueB.number = 1450;
    [colleagueA notice];
    NSLog(@"%f---%f",colleagueA.number,colleagueB.number);
    colleagueB.number = 123;
    [colleagueB notice];
    NSLog(@"%f---%f",colleagueA.number,colleagueB.number);
}

@end



2. HCDAbstractColleague.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@class HCDAbstractMediator;

@interface HCDAbstractColleague : NSObject

@property (nonatomic, assign) CGFloat number;

- (void)notice;

@property(nonatomic,strong) HCDAbstractMediator *mediator;

@end

3. HCDAbstractColleague.m

#import "HCDAbstractColleague.h"
#import "HCDAbstractMediator.h"

@implementation HCDAbstractColleague

@end

4. HCDMediator.h

#import <Foundation/Foundation.h>
#import "HCDAbstractMediator.h"

@interface HCDMediator : HCDAbstractMediator

@end


5. HCDMediator.m

#import "HCDMediator.h"

@implementation HCDMediator

@synthesize colleagueB = _colleagueB;
@synthesize colleagueA = _colleagueA;

- (instancetype)initWithColleagueA:(HCDAbstractColleague *)colleagueA colleagueB:(HCDAbstractColleague *)colleagueB
{
    self = [super init];
    if (self) {
        _colleagueA = colleagueA;
        _colleagueB = colleagueB;
    }
    return self;
}

- (void)setValueToColleagueA:(CGFloat)value
{
    self.colleagueA.number = value * 100;
}

- (void)setValueToColleagueB:(CGFloat)value
{
    self.colleagueB.number = value * 0.01;
}

@end

6. HCDColleagueA.h

#import "HCDAbstractColleague.h"

@interface HCDColleagueA : HCDAbstractColleague

@end


7. HCDColleagueA.m

#import "HCDColleagueA.h"
#import "HCDAbstractMediator.h"

@implementation HCDColleagueA

- (void)notice
{
    [self.mediator setValueToColleagueB:self.number];
}

@end


8. HCDColleagueB.h

#import "HCDAbstractColleague.h"

@interface HCDColleagueB : HCDAbstractColleague

@end


9. HCDColleagueB.m

#import "HCDColleagueB.h"
#import "HCDAbstractMediator.h"

@implementation HCDColleagueB

- (void)notice
{
    [self.mediator setValueToColleagueA:self.number];
}

@end


10. HCDAbstractMediator.h

#import <Foundation/Foundation.h>
#import "HCDColleagueB.h"
#import "HCDColleagueA.h"

@interface HCDAbstractMediator : NSObject

- (instancetype)initWithColleagueA:(HCDAbstractColleague *)colleagueA colleagueB:(HCDAbstractColleague *)colleagueB;

@property (nonatomic, weak) HCDAbstractColleague *colleagueA;
@property (nonatomic, weak) HCDAbstractColleague *colleagueB;

- (void)setValueToColleagueA:(CGFloat)value;
- (void)setValueToColleagueB:(CGFloat)value;

@end


11. HCDAbstractMediator.m
#import "HCDAbstractMediator.h"

@implementation HCDAbstractMediator

@end

看结果。

2017-04-29 11:23:14.332 20中介者模式[1615:39216] 1450.000000---14.500000
2017-04-29 11:23:14.333 20中介者模式[1615:39216] 12300.000000---123.000000

结论:思想。

后记

  今天是五一放假的第一天,起来的有点晚,大约十点多才起床,起来了以后才想起来有一篇还没写,就接着写了,下午再写一篇,给23种设计模式一个了结,再次谢谢大家。

大海美图

相关文章

  • 设计模式复习

    常用十大设计模式 一、设计模式概述 1.1软件设计模式的产生背景 "设计模式"最初并不是出现在软件设计中,而是被用...

  • 单例模式

    JAVA设计模式之单例模式 十种常用的设计模式 概念: java中单例模式是一种常见的设计模式,单例模式的写法...

  • Android 模板方法模式

    Android 设计模式系列文章 Android 23种设计模式 前言 模板方法模式是一种我们十分常见的模式,比如...

  • 设计模式-外观模式(十)

    外观模式,又叫门面模式 外部对子系统的通信必须要有一个统一的门面对象进行. 一个复杂系统可以有几个门面 满足迪米特...

  • 设计模式(十)代理模式

    本期我们将继续讨论设计模式,介绍代理模式,代理模式与很多设计模式有相似的地方,但其目的却又不同。如果读者多其他设计...

  • 设计模式十--桥梁模式

    定义 将抽象和实现解耦,使得两者可以独立的变化 角色 1:抽象化角色(Abstraction)该角色抽象化给出的定...

  • 设计模式(十):状态模式

    转载请注明作者和出处:https://www.jianshu.com/p/61b24f9b8e25 运行平台: W...

  • 设计模式-外观模式《十》

    何为外观模式 定义:为系统中的一组接口提供一个统一接口,外观定义一个高层接口,让子系统更易于使用 静态关系图如下 ...

  • 设计模式(十):组合模式

    组合模式(Composite Pattern)又叫做部分-整体模式,用于将对象组合成树形结构以表示“部分-整体”的...

  • 设计模式(十)-策略模式

    策略模式 策略模式作为一种软件设计模式,指对象的某个行为,在不同场景中,该行为有不同的实现算法. 图例image....

网友评论

    本文标题:23种设计模式(十)

    本文链接:https://www.haomeiwen.com/subject/gxdzzttx.html