swift - The Adapter Pattern

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



Diagram:


client:


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

println("--List--");

for ein search.employees {

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

}

println("--Search--");

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

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

}



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

pattern:

class SearchTool {

enum SearchType {

case NAME; case TITLE;

}

privatelet sources:[EmployeeDataSource];

init(dataSources: EmployeeDataSource...) {

self.sources = dataSources;

}

var employees:[Employee] {

var results = [Employee]();

for source insources {

results += source.employees;

}

return results;

}

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

var results = [Employee]();

for source insources {

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;

})

}

privatefunc 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];

}

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...