访问者模式

定义

封装一些用于某种数据结构中的各元素的操作,可以在不改变这个数据结构的前提下定义作用与其内部各个元素的新操作

场景

某个类里面包含各种类型的元素,这个类的结构较稳定,不会经常增删不同类型的元素,而需要经常给这些元素添加新的操作,考虑使用该设计模式。

实现

假如一个小的创业公司,只有一个IT技术人员和测试人员,刚开始准备做一个APP,技术做开发,测试去测APP,后面发现这条路不行,转型做代理产品销售,技术人员提供产品服务,测试转型做销售。
1、UML图


访问者模式 (2).png

2、使用

  • 创建抽象角色及访问者
@interface Visitor : NSObject
-(void)visitorProgrammer:(Programmer *)programmer;
-(void)visitorTester:(Tester *)tester;
@end
#import "Visitor.h"

@implementation Visitor
- (void)visitorTester:(Tester *)tester{
    
}

- (void)visitorProgrammer:(Programmer *)programmer{
    
}
@end

@class Visitor;
@interface Accept : NSObject
-(void)accept:(Visitor*)visitor;
@end
#import "Accept.h"

@implementation Accept
- (void)accept:(Visitor*)visitor{
    
}
@end
  • 创建具体角色及具体访问者
@interface Programmer : Accept
-(instancetype)initWithName:(NSString *)name;
@property(nonatomic, copy)NSString *name;
@end
#import "Programmer.h"
#import "Visitor.h"
@implementation Programmer
- (instancetype)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        self.name = name;
    }
    return self;
}

- (void)accept:(Visitor *)visitor{
    [visitor visitorProgrammer:self];
}
@end
@interface Tester : Accept
@property(nonatomic, copy)NSString *name;
-(instancetype)initWithName:(NSString *)name;
@end
#import "Tester.h"
#import "Visitor.h"
@implementation Tester
- (instancetype)initWithName:(NSString *)name
{
    self = [super init];
    if (self) {
        self.name = name;
    }
    return self;
}

- (void)accept:(Visitor*)visitor{
    [visitor visitorTester:self];
}
@end

@interface TechVisitor : Visitor

@end
#import "TechVisitor.h"

@implementation TechVisitor
- (void)visitorTester:(Tester *)tester{
    NSLog(@"%@ 测试app", tester.name);
}

- (void)visitorProgrammer:(Programmer *)programmer{
    NSLog(@"%@ 开发个类似抖音的APP", programmer.name);
}
@end
@interface SaleVisitor : Visitor

@end
#import "SaleVisitor.h"

@implementation SaleVisitor
- (void)visitorTester:(Tester *)tester{
    NSLog(@"%@ 销售代理的产品", tester.name);
}

- (void)visitorProgrammer:(Programmer *)programmer{
    NSLog(@"%@ 销售的产品进行技术服务", programmer.name);
}
@end
  • 创建目的类
@interface Company : NSObject
-(void)addAccept:(Accept*)accept;
-(void)switchVistor:(Visitor*)visitor;
@end
#import "Company.h"
@interface Company()
@property(nonatomic, strong)NSMutableArray *array;
@end
@implementation Company

- (instancetype)init
{
    self = [super init];
    if (self) {
        self.array = [[NSMutableArray alloc] init];
    }
    return self;
}
- (void)addAccept:(Accept *)accept{
    [self.array addObject:accept];
}

- (void)switchVistor:(Visitor *)visitor{
    for(Accept *accept in self.array){
        [accept accept:visitor];
    }
}
@end
  • Client调用
    Programmer *programer = [[Programmer alloc] initWithName:@"IT大神"];
    Tester *tester = [[Tester alloc] initWithName:@"小红"];
    Company *company = [[Company alloc] init];
    [company addAccept:programer];
    [company addAccept: tester];
    
    //技术公司
    [company switchVistor:[[TechVisitor alloc] init]];
    
    //转型做代理销售公司
    [company switchVistor:[[SaleVisitor alloc] init]];

总结

使得结构稳定的对象增加新的算法变得容易,提高了代码的可维护性,可扩展性

代码

链接: https://pan.baidu.com/s/1CPMPyjHCdwM5dzLY1xtzMg 提取码: a69q

你可能感兴趣的:(访问者模式)