美文网首页
iOS设计模式:中介者

iOS设计模式:中介者

作者: younger_times | 来源:发表于2017-03-01 10:39 被阅读8次

    视频教程-极客学院

    ps:感觉打的一手好广告啊,因为自己不太爱看视频,但这类又必须看才能明白。粘贴源代码是为了以后查阅方便,也注释了自己的理解。

    如同我们熟悉现实中的中介,多个顾客把要售卖的房子交给中介,然后中介进行管理,顾客说房子要涨一点,那么中介那里的信息也会要更新。同时,顾客也会去找其他中介。一个中介会有多个顾客。一个顾客也可能会有多个中介。

    AbstractColleague(Mediator)

    抽象的中介者

    #import <Foundation/Foundation.h>
    #import "AbstractColleague.h"
    
    /**
     抽象的中介类,因为要和顾客签订协议,所以在抽象类定义了顾客的协议
     他说涨就涨,说降就降,从来不顾中介的感受
     */
    @interface AbstractMediator : NSObject <ColleagueDelegate>
    
    @end
    
    #import "AbstractMediator.h"
    
    @implementation AbstractMediator
    
    
    //顾客的协议,空实现
    - (void)colleagueEvent:(AbstractColleague *)event {
    
    }
    
    @end
    

    AbstractColleague(Colleague)

    抽象的同事类 ;顾客

    #import <Foundation/Foundation.h>
    @class AbstractColleague;
    
    #顾客的协议
    @protocol ColleagueDelegate <NSObject>
    
    @optional
    
    /**
     *  colleague对象的交互
     *
     *  @param event Colleague对象
     */
    - (void)colleagueEvent:(AbstractColleague *)event;
    
    @end
    
    @interface AbstractColleague : NSObject
    
    @property (nonatomic, weak) id <ColleagueDelegate> delegate;
    
    @end
    
    #import "AbstractColleague.h"
    
    @implementation AbstractColleague
    
    @end
    

    TypeOneMediator(ConcreteMediator)

    具体的中介者

    #import "AbstractMediator.h"
    #import "Colleague.h"
    
    @interface TypeOneMediator : AbstractMediator //这里继承父类的好处是:不必有很多类型中介写多次协议父类已经对通用的方法做了约束
    
    //三位顾客
    @property (nonatomic, strong) Colleague  *colleagueA;
    @property (nonatomic, strong) Colleague  *colleagueB;
    @property (nonatomic, strong) Colleague  *colleagueC;
    
    /**
     *  查看信息
     *
     *  @return Colleague相关的信息
     */
    - (NSDictionary *)values;
    
    @end
    
    #import "TypeOneMediator.h"
    
    @implementation TypeOneMediator
    
    - (void)colleagueEvent:(AbstractColleague *)event {
     
    //定义他们自己的价格
        if ([event isEqual:self.colleagueA]) {
            
            self.colleagueB.value = self.colleagueA.value * 2;
            self.colleagueC.value = self.colleagueA.value * 4;
            
        } else if ([event isEqual:self.colleagueB]) {
        
            self.colleagueA.value = self.colleagueB.value / 2.f;
            self.colleagueC.value = self.colleagueB.value * 2.f;
            
        } else {
        
            self.colleagueA.value = self.colleagueC.value / 4.f;
            self.colleagueB.value = self.colleagueC.value / 2.f;
        }
    }
    
    - (NSDictionary *)values {
    
        return @{@"A" : @(self.colleagueA.value),
                 @"B" : @(self.colleagueB.value),
                 @"C" : @(self.colleagueC.value)};
    }
    
    @end
    

    Colleague(ConcreteColleague)

    具体的顾客

    #import <UIKit/UIKit.h>
    #import "AbstractColleague.h"
    
    @interface Colleague : AbstractColleague
    
    @property (nonatomic) CGFloat value;
    
    /**
     *  修改数值
     *
     *  @param value 数值
     */
    - (void)changeValue:(CGFloat)value;
    
    @end
    
    #import "Colleague.h"
    
    @implementation Colleague
    
    - (void)changeValue:(CGFloat)value {
    
        self.value = value;
        if (self.delegate && [self.delegate respondsToSelector:@selector(colleagueEvent:)]) {
            
            [self.delegate colleagueEvent:self];
        }
    }
    
    @end  
    

    实现

    #import "ViewController.h"
    #import "TypeOneMediator.h"
    #import "TypeTwoMediator.h"
    #import "Colleague.h"
    
    @interface ViewController ()
    
    @property (nonatomic, strong) TypeTwoMediator  *mediator;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        
        [super viewDidLoad];
        
        // 中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
        
        self.mediator = [TypeTwoMediator new];  //类型二的中介者 可以随时修改
        
        Colleague *colleagueA = [Colleague new]; //客户1
        Colleague *colleagueB = [Colleague new]; //客户2
        Colleague *colleagueC = [Colleague new]; //客户3
        
        //3个客户进入中介
        self.mediator.colleagueA = colleagueA;
        self.mediator.colleagueB = colleagueB;
        self.mediator.colleagueC = colleagueC;
        
        //并和中介签订协议,由中介来完成
        colleagueA.delegate = self.mediator;
        colleagueB.delegate = self.mediator;
        colleagueC.delegate = self.mediator;
        
        //顾客修改了信息,中介也需要对信息更新
        [colleagueA changeValue:2.f];
        NSLog(@"%@", [self.mediator values]);
        
        [colleagueA changeValue:1.f];
        NSLog(@"%@", [self.mediator values]);
    
        [colleagueA changeValue:3.f];
        NSLog(@"%@", [self.mediator values]);
    }
    
    

    相关文章

      网友评论

          本文标题:iOS设计模式:中介者

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