Visitor(訪問者模式)
表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作跟匆。它使你可以在不改變各元素的類(男人汗侵,女人)的前提下定義作用于這些元素的新操作(喜怒哀樂)盒卸。他把數(shù)據(jù)結(jié)構(gòu)(男人饿序,女人)和作用于數(shù)據(jù)結(jié)構(gòu)之上的操作(喜怒哀樂)之間的耦合解脫開赔癌,使得操作集合可以相對(duì)自由地演化
訪問者模式的優(yōu)點(diǎn)就是增加新的操作很容易卧惜,因?yàn)樵黾有碌牟僮骶鸵馕吨黾右粋€(gè)新的訪問者攀痊。
VC.m
/*
HCDConcreteElementA和HCDConcreteElementB相當(dāng)于男人女人(固定不變)岸霹,當(dāng)男人女人接收到喜怒哀樂(HCDConcreteVisitor1,HCDConcreteVisitor2)有不同的結(jié)果躁锁。HCDObjectStructure用于管理他們之間的關(guān)系纷铣。
*/
HCDObjectStructure *o = [[HCDObjectStructure alloc]init];
//初始化不同的element對(duì)象
HCDConcreteElementA *eA = [HCDConcreteElementA new];
HCDConcreteElementB *eB = [HCDConcreteElementB new];
//加入o對(duì)象里面,存在一個(gè)數(shù)據(jù)結(jié)構(gòu)o中战转。
[o attach:eA];
[o attach:eB];
//初始化不同的visitor對(duì)象搜立。
HCDConcreteVisitor1 *v1 = [HCDConcreteVisitor1 new];
HCDConcreteVisitor2 *v2 = [HCDConcreteVisitor2 new];
//eA,eB(男人女人)接收到訪問者v1(喜)的不同反應(yīng)。
[o accept: v1];
NSLog(@"================================");
//eA,eB(男人女人)接收到訪問者v2(怒)的不同反應(yīng)槐秧。
[o accept: v2];
HCDObjectStructure.h
@interface HCDObjectStructure : NSObject
{
NSMutableArray *elements;
}
//添加和刪除element
-(void)attach:(HCDElements *)element;
-(void)detach:(HCDElements *)element;
//接受一個(gè)visitor
-(void)accept:(HCDVisitors *)visitor;
@end
HCDObjectStructure.m
@implementation HCDObjectStructure
-(instancetype)init{
self = [super init];
if (self) {
elements = [[NSMutableArray alloc]init];
}
return self;
}
-(void)attach:(HCDElements *)element{
[elements addObject:element];
}
-(void)detach:(HCDElements *)element{
[elements removeObject:element];
}
-(void)accept:(HCDVisitors *)visitor{
for (HCDElements *e in elements) {
[e accept:visitor];
}
}
@end