swift - The Chain Responsibility pattern

swift - The Chain Responsibility pattern,第1张

概述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 componen

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.

责任链模式:把两种/多种解决方案封装到到一个链里,提供一个封闭的接口一一尝试。


clIEnt:

let messages = [

Message(from:"bob@example.com",to:"joe@example.com",

subject:"Free for lunch?"),

Message(from:"joe@example.com",to:"alice@acme.com",

subject:"New Contracts"),19)"> Message(from:"pete@example.com",to:"all@example.com",

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;

}

//2

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);

}

}

总结

以上是内存溢出为你收集整理的swift - The Chain Responsibility pattern全部内容,希望文章能够帮你解决swift - The Chain Responsibility pattern所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1084892.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存