swift - The Adapter Pattern

來源:互聯網
上載者:User

標籤:swift

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

swift - The Adapter Pattern

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.