swift - The Adapter Pattern

This pattern allows two objects that provide related functionality to work together even when they have incompatible APIs.

回家之后我用xcode ide整理成swift风格的代码格式

Diagram:

client:

let search = SearchTool(dataSources: SalesDataSource(), DevelopmentDataSource());

println("--List--");

for e in search.employees {

println("Name: \(e.name)");

}

println("--Search--");

for e in search.search("VP", type: SearchTool.SearchType.TITLE) {

println("Name: \(e.name), Title: \(e.title)");

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

pattern:

class SearchTool {

enum SearchType {

case NAME; case TITLE;

}

private let sources:[EmployeeDataSource];

init(dataSources: EmployeeDataSource...) {

self.sources = dataSources;

}

var employees:[Employee] {

var results = [Employee]();

for source in sources {

results += source.employees;

}

return results;

}

func search(text:String, type:SearchType) -> [Employee] {

var results = [Employee]();

for source in sources {

results += type == SearchType.NAME ? source.searchByName(text)

: source.searchByTitle(text);

}

return results;

}

}

///

class DataSourceBase : EmployeeDataSource {

var employees = [Employee]();

func searchByName(name: String) -> [Employee] {

return search({e -> Bool in

return e.name.rangeOfString(name) != nil;

});

}

func searchByTitle(title: String) -> [Employee] {

return search({e -> Bool in

return e.title.rangeOfString(title) != nil;

})

}private func search(selector:(Employee -> Bool)) -> [Employee] {

var results = [Employee]();

for e in employees {

if (selector(e)) {

results.append(e);

}

}

return results;

}

}

class SalesDataSource : DataSourceBase {

override init() {

super.init();

employees.append(Employee(name: "Alice", title: "VP of Sales"));

employees.append(Employee(name: "Bob", title: "Account Exec"));

}

}

class DevelopmentDataSource : DataSourceBase {

override init() {

super.init();

employees.append(Employee(name: "Joe", title: "VP of Development"));

employees.append(Employee(name: "Pepe", title: "Developer"));

}

}

/////////

struct Employee {

var name:String;

var title:String;

}

protocol EmployeeDataSource {

var employees:[Employee] { get };

func searchByName(name:String) -> [Employee];

func searchByTitle(title:String) -> [Employee];

}

时间: 2024-11-08 11:07:34

swift - The Adapter Pattern的相关文章

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 详解

适配器模式(adapter pattern) 枚举器和迭代器 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本的枚举器(Enumeration)和现在的迭代器(Iterator) 可以使用适配器(adapter)进行转换. 适配器(adapter)代码: /** *

适配器模式--Adapter Pattern

模拟场景:很多人都喜欢看NBA吧,姚明进驻NBA,打开了中国的市场.虽然后面姚明在NBA打得还不错,但是在刚进入NBA篮坛的时候,并不是那么顺利的.语言交流就是一个最大的问题.刚开始打球期间,教练及队员的战术部署姚明都无法理解,所以他需要这么一个翻译者,将教练及队员的意思转达给姚明,这样才可以进行合作. 现在进行场景的模拟,先不考虑那么多.假如姚明一开始进入NBA的时候就已经会英语,可以进行交流了.那么这个时候教练就可以进行战术的部署了. 转换成类,所有的队员都要服从教练的战术要求,假设现在教练

设计模式之适配器模式(Adapter Pattern)

适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 1. 解决的问题 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2. 模式中的角色 2.1 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 2.2 需要适配的类(Adaptee):需要适配的类或适配者类. 2.3 适配器(Adapter):通过包装一个需要适配的对象,把

Java设计模式之适配器模式(Adapter Pattern)

Adapter Pattern的作用是在不改变功能的前提下转换接口.Adapter分为两类,一类是Object Adapter, 另一类是Class Adapter.由于Class Adapter的实现需要用到多继承,而Java不支持多继承,所以这里只关注Object Adapter. 在JDK1.5之前是没有 java.util.Iterator 接口的,java.util.Enumeration 接口起着 Iterator 的作用.那么如果我们需要维护一些年代比较久远的代码,可能就会面临着没

设计模式完结(6)--适配器模式(adapter pattern)

总结:其实就是组合复用,关联已有类对象来使用.就这么简单 使用场景:不兼容结构的协调 如何在既不修改现有接口又不需要任何算法库代码的基础上能够实现算法库的重用? 适配器模式(Adapter Pattern): 适配器模式可分为对象适配器(关联关系)和类适配器(继承关系).在实际开发中,对象适配器的使用频率更高,对象适配器模式结构如图9-3所示:  缺省适配器模式(Default Adapter Pattern): 当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本号的枚举器(Enumeration)和如今的迭代器(Iterator) 能够使用适配器(adapter)进行转换. 适配器(adapter)代码: /**

如何让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

如何让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 概念相关 定义: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 简单点说: 两个彼此间没有太大关联的类,想进行交互完成某些事情,如果 直接去修改各自的接口,就显得有些繁琐了,可以加个中间类, 用它来协调两类之间的关系,完成相关业务.这种玩法就叫适配器模式! 两种适配器模式: 根据适配器类与适配者类的关系不同,适配器模式可分为 类适配器 和 对

二十四种设计模式:适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 示例有一个Message实体类,某个类对它的操作有Insert()和Get()方法.现在需要把这个类转到另一个接口,分别对应Add()和Select()方法. MessageModel using System; using System.Collections.Generic; using System.Text; name

第 8 章 适配器模式【Adapter Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛.今天讲适配器模式,这个模式也很简单,你笔记本上的那个拖在外面的黑盒子就是个适配器,一般你在中国能用,在日本也能用,虽然两个国家的的电源电压不同,中国是220V,日本是110V,但是这个适配器能够把这些不同的电压转换为你需要的36V 电压,保证你的笔记本能够正常运行,那我们在设计模式中引入这个适配器模式是不是也是这个意思呢?是的,一样的作用,两个不同接口,有不同