The chain of responsibility pattern is useful when there are multiple objects that Could take responsibility for a request but you don’t want to expose details of those objects to the calling component.
责任链模式:把两种/多种解决方案封装到到一个链里,提供一个封闭的接口一一尝试。
let messages = [
Message(from:"[email protected]",to:"[email protected]",
subject:"Free for lunch?"),
Message(from:"[email protected]",to:"alice@acme.com",
subject:"New Contracts"),19)"> Message(from:"[email protected]",to:"[email protected]",
subject: "Priority: All-Hands Meeting"),
];
iflet chain =Transmitter.createChain(true) {
for msgin messages {
let handled = chain.sendMessage(msg);
println("Message sent:\(handled)");
}
}
//1
struct Message {
let from:String;
let to:String;
let subject:String;
}
class Transmitter {
var nextLink:Transmitter?;
required init() {}
func sendMessage(message:Message,handled:Bool =false) ->Bool {
if (nextLink !=nil) {
returnnextLink!.sendMessage(message,handled: handled);
}elseif (!handled) {
println("End of chain reached. Message not sent");
}
return handled;
}
classfunc createChain(localOnly:Bool) ->Transmitter? {
let transmitterClasses:[Transmitter.Type]
= localOnly ? [PriorityTransmitter.self,LocalTransmitter.self]
: [PriorityTransmitter.self,LocalTransmitter.self,RemoteTransmitter.self];
var link:Transmitter?;
for tClassin transmitterClasses.reverse() {
let existingLink = link;
link = tClass();
link?.nextLink = existingLink;
}
return link;
}
privateclassfunc matchEmailSuffix(message:Message) ->Bool {
iflet index =find(message.from,"@") {
return message.to.hasSuffix(message.from[Range<String.Index>(start:
index,end: message.from.endindex)]);
}
return false;
}
}
class LocalTransmitter :Transmitter {
overridefunc sendMessage(message:Message,var handled:Bool) ->Bool {
if (!handled &&Transmitter.matchEmailSuffix(message)) {
println("Message to\(message.to) sent locally");
handled =true;
}
returnsuper.sendMessage(message,handled: handled);
}
}
class RemoteTransmitter :Transmitter {
overridefunc sendMessage(message:Message,var handled:Bool) ->Bool {
if (!handled && !Transmitter.matchEmailSuffix(message)) {
println("Message to\(message.to) sent remotely");
handled =true;
}
returnsuper.sendMessage(message,handled: handled);
}
}
class PriorityTransmitter :Transmitter {
var totalMessages =0;
var handledMessages =0;
overridefunc sendMessage(message:Message,var handled:Bool) ->Bool {
totalMessages++;
if (!handled && message.subject.hasPrefix("Priority")) {
handledMessages++;
println("Message to\(message.to) sent as priority");
println("Stats: Handled\(handledMessages) of\(totalMessages)");
handled =true;
}
returnsuper.sendMessage(message,handled: handled);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。