swift - The Chain Responsibility pattern

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"),

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

    }

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值