Objective C 语言 实现责任链模式的动态链

Objective-C阿木 发布于 17 天前 3 次阅读


责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求的发送者和接收者解耦。这种模式使得多个对象都有机会处理请求,从而避免了请求发送者和接收者之间的耦合关系。在责任链模式中,通常有一个链头和多个链节,每个链节都包含一个处理请求的方法,如果当前链节不能处理请求,则将请求传递给下一个链节。

以下是一个使用Objective-C语言实现的简单责任链模式的示例。我们将创建一个处理请求的链,每个处理者(Handler)都负责处理特定类型的请求。

责任链模式在Objective-C中的实现

1. 定义请求类

我们需要定义一个请求类,它将携带请求的相关信息。

objc

@interface Request : NSObject

@property (nonatomic, strong) NSString requestType;

- (instancetype)initWithRequestType:(NSString )requestType;

@end

@implementation Request

- (instancetype)initWithRequestType:(NSString )requestType {


self = [super init];


if (self) {


_requestType = requestType;


}


return self;


}

@end


2. 定义处理者类

接下来,我们定义一个处理者基类,它将包含处理请求的方法和指向下一个处理者的指针。

objc

@interface Handler : NSObject

@property (nonatomic, strong) Handler nextHandler;

- (void)handleRequest:(Request )request;

@end

@implementation Handler

- (void)handleRequest:(Request )request {


// 处理请求的逻辑


NSLog(@"Handling request of type: %@", request.requestType);



// 如果当前处理者无法处理请求,则传递给下一个处理者


if (_nextHandler) {


[_nextHandler handleRequest:request];


}


}

@end


3. 实现具体处理者

现在,我们创建几个具体处理者类,它们分别处理不同类型的请求。

objc

@interface SpecificHandlerA : Handler

@end

@implementation SpecificHandlerA

- (void)handleRequest:(Request )request {


if ([request.requestType isEqualToString:@"TypeA"]) {


// 处理TypeA请求


NSLog(@"SpecificHandlerA handled TypeA request.");


} else {


// 传递给下一个处理者


[super handleRequest:request];


}


}

@end

@interface SpecificHandlerB : Handler

@end

@implementation SpecificHandlerB

- (void)handleRequest:(Request )request {


if ([request.requestType isEqualToString:@"TypeB"]) {


// 处理TypeB请求


NSLog(@"SpecificHandlerB handled TypeB request.");


} else {


// 传递给下一个处理者


[super handleRequest:request];


}


}

@end


4. 创建责任链

我们创建一个责任链,将处理者按顺序连接起来。

objc

Handler handlerA = [[SpecificHandlerA alloc] init];


Handler handlerB = [[SpecificHandlerB alloc] init];


handlerA.nextHandler = handlerB;

// 创建请求


Request requestA = [[Request alloc] initWithRequestType:@"TypeA"];


Request requestB = [[Request alloc] initWithRequestType:@"TypeB"];


Request requestC = [[Request alloc] initWithRequestType:@"TypeC"];

// 处理请求


[handlerA handleRequest:requestA];


[handlerA handleRequest:requestB];


[handlerA handleRequest:requestC];


5. 运行程序

运行上述代码,你将看到处理者按照顺序处理了请求,并且如果请求类型不是它们所处理的类型,它们会将请求传递给下一个处理者。

总结

在这个示例中,我们使用Objective-C实现了责任链模式。通过创建一个处理者链,我们可以灵活地添加或移除处理者,而不需要修改请求发送者的代码。这种模式在处理请求时提供了很好的灵活性和扩展性。

责任链模式在许多场景中非常有用,例如:

- 当一个请求需要被多个对象处理,并且这些对象不知道彼此的存在时。

- 当一个请求的处理者可能不止一个,并且这些处理者之间有明确的处理顺序时。

- 当你想在不明确指定具体处理者的情况下处理请求时。

通过使用责任链模式,我们可以设计出更加灵活和可扩展的系统。