微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐