中介者模式(Mediator Pattern)

2022-09-16  本文已影响0人  long弟弟

中介者模式,调停模式

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

在中介者模式中,类之间的交互行为统一放在中介者的对象中,对象通过中介者对象同其他对象交互,中介对象起着控制器的作用。

中介者模式.jpg

角色和职责

  1. Mediator 抽象中介者
    中介者类的抽象父类,定义一个接口用于各同事(Colleague)对象通信
  2. ConcreteMediator
    具体的中介者类,通过协调各同事对象实现协作行为
    了解并维护它的各个同事
  3. Colleague
    同事类的抽象父类
  4. ConcreteColleague
    具体的同事类,每个同事类都知道它的中介者对象
    每一个同事对象在需要与其他同事通信的时候,与它的中介者通信

代码示例

未使用中介者模式

#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int sex;
@property (nonatomic, assign) int condition;
@end
@implementation Person
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition {
    return nil;
}
- (void)findPartner:(Person *)person {}
@end

@interface Man : Person

@end
@implementation Man
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition {
    if (self = [super init]) {
        self.name = name;
        self.sex = sex;
        self.condition = condition;
    }
    return self;
}
//找对象
- (void)findPartner:(Person *)person {
    if (person.sex == self.sex) {
        NSLog(@"不找同性恋");
    }else if (person.condition == self.condition) {
        NSLog(@"%@和%@ 般配", self.name, person.name);
    }else {
        NSLog(@"%@和%@ 不般配", self.name, person.name);
    }
}
@end

@interface Woman : Person
@end
@implementation Woman
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition {
    if (self = [super init]) {
        self.name = name;
        self.sex = sex;
        self.condition = condition;
    }
    return self;
}

- (void)findPartner:(Person *)person {
    if (person.sex == self.sex) {
        NSLog(@"不找同性恋");
    }else if (person.condition == self.condition) {
        NSLog(@"%@和%@ 般配", self.name, person.name);
    }else {
        NSLog(@"%@和%@ 不般配", self.name, person.name);
    }
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *xiaohong = [[Woman alloc] initWithName:@"小红" AndSex:0 AndCondition:5];
        Person *zs = [[Man alloc] initWithName:@"张三" AndSex:1 AndCondition:4];
        Person *ls = [[Man alloc] initWithName:@"李四" AndSex:1 AndCondition:5];
        //小红自己找对象,对张三李四的关系太密切了
        [xiaohong findPartner:zs];
        [xiaohong findPartner:ls];
    }
    return 0;
}
/*
小红和张三 不般配
小红和李四 般配
*/

使用中介者模式

#import <Foundation/Foundation.h>
@class Mediator;

@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int sex;
@property (nonatomic, assign) int condition;
@property (nonatomic, strong) Mediator *mediator;
@end
@implementation Person
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition AndMediator:(Mediator *)mediator {
    return nil;
}
- (void)findPartner:(Person *)person {
    
}
@end

@interface Mediator : NSObject
@property (nonatomic, strong) Person *pMan;
@property (nonatomic, strong) Person *pWoman;
@end
@implementation Mediator
- (void)findPartner {
    if (self.pWoman.sex == self.pMan.sex) {
        NSLog(@"不找同性恋");
    }else if (self.pWoman.condition == self.pMan.condition) {
        NSLog(@"%@和%@ 般配", self.pWoman.name, self.pMan.name);
    }else {
        NSLog(@"%@和%@ 不般配", self.pWoman.name, self.pMan.name);
    }
}
@end

@interface Man : Person
@end
@implementation Man
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition AndMediator:(Mediator *)mediator {
    if (self = [super init]) {
        self.name = name;
        self.sex = sex;
        self.condition = condition;
        self.mediator = mediator;
    }
    return self;
}

- (void)findPartner:(Person *)person {
    self.mediator.pMan = self;
    self.mediator.pWoman = person;
    [self.mediator findPartner];
}
@end

@interface Woman : Person
@end
@implementation Woman
- (instancetype)initWithName:(NSString *)name AndSex:(int)sex AndCondition:(int)condition AndMediator:(Mediator *)mediator {
    if (self = [super init]) {
        self.name = name;
        self.sex = sex;
        self.condition = condition;
        self.mediator = mediator;
    }
    return self;
}
- (void)findPartner:(Person *)person {
    self.mediator.pMan = person;
    self.mediator.pWoman = self;
    [self.mediator findPartner];
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Mediator *mediator = [[Mediator alloc] init];
        Person *xh = [[Woman alloc] initWithName:@"小红" AndSex:0 AndCondition:5 AndMediator:mediator];
        Person *zs = [[Man alloc] initWithName:@"张三" AndSex:1 AndCondition:4 AndMediator:mediator];
        Person *ls = [[Man alloc] initWithName:@"李四" AndSex:1 AndCondition:5 AndMediator:mediator];
        [xh findPartner:zs];//实际是由中介匹配zs的性别、条件等
        [xh findPartner:ls];
    }
    return 0;
}
/*
小红和张三 不般配
小红和李四 般配
*/

用处

用一个中介对象,封装一系列对象(同事)的交换,中介者是各个对象不需要显示的相互作用,从而实现了耦合松散,而且可以独立的改变他们之间的交换。
应用场景:飞机塔台、婚姻介绍所、房屋中介...
多个对象相互耦合形成网状结构,利用中介者模式将网状结构分离为星型结构。

优点

  1. 简化对象之间的交互,将各参与者进行解耦
    对于复杂的对象之间的交互,引入中介者,可以简化各类的设计和实现
  2. 符合迪米特法则

缺点

具体中介者中包含了参与者之间的交互细节,可能会使中介者类本身非常复杂

题外话

  1. 忽略抽象的Mediator类
    如使用中介者模式的代码示例中,各Colleague仅与一个Mediator一起工作,没必要定义一个抽象的Mediator类。
  2. 代码示例中,中介者模式持有了ManWoman两个指针,也可以进行扩展,持有N个对象的集合...
上一篇 下一篇

猜你喜欢

热点阅读