swift - The Chain Responsibility pattern
2015-08-31 23:40
507 查看
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);
}
}
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);
}
}
相关文章推荐
- swift详解之十九--------------UITableView的基本操作(下拉刷新,新增删除,分组,检索等)
- IOS--Swift 01
- Swift UILabel 文字大小随着宽度调整
- Swift UILabel常用功能
- Swift子类初始化函数中调用父类初始化函数的正确位置
- swift 创建单例模式
- 【IOS-Swift】实战笔记——数据持久化之NSUserDefaults(本地轻量级数据存储)
- 【IOS-Swift】实战笔记——数据持久化之归档NSKeyedArchiver
- [iOS]#Swift#OC+Swift混编
- JAVA人学习ios swift(笔记)
- Swift2.0发布以来的历次主要更新
- Swift UIview简单动画
- 《从零开始学Swift》学习笔记(Day 8)——小小常量、变量大作用
- Swift 2.0学习笔记(Day 8)——小小常量、变量大作用
- 实例教程:快速上手iOS iBeacon开发(Swift版)
- Swift - 集合类型
- Swift入门(十二)——利用Extension添加逆序输出字符串方法
- Swift - 字符和字符串
- swift详解之十八------------ScrollView
- Swift2.0不深入只浅出入门教程-01-The Basic