swift - The Decorator Pattern

装饰者模式:多个类派生于一个基础类,这几个类可以嵌套构造来装饰。

I described the decorator pattern and explained how it can be used to change thebehavior of objects at runtime. The decorator pattern is especially useful when dealing with classesthat cannot be modified and makes it easy to enhance applications even when working withthird-party or legacy frameworks.


client:

let account =CustomerAccount(name:"Joe");


account.addPurchase(Purchase(product:"Red Hat",price: 10));

account.addPurchase(Purchase(product:"Scarf",price: 20));

account.addPurchase(EndOfLineDecorator(purchase:BlackFridayDecorator(purchase:

GiftOptionDecorator(purchase: Purchase(product: "Sunglasses",price:25),

options:GiftOptionDecorator.OPTION.GIFTWRAP,

GiftOptionDecorator.OPTION.DELIVERY))));


account.printAccount();


for p inaccount.purchases {

iflet d = p as? DiscountDecorator {

println("\(p) has\(d.countDiscounts()) discounts");

}else {

println("\(p) has no discounts");

}

}


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

pattern:

class Purchase :Printable {

private let product:String;

private let price:Float;

init(product:String,price:Float) {

self.product = product;

self.price = price;

}

var description:String {

return product;

}

var totalPrice:Float {

return price;

}

}

////

class GiftOptionDecorator :Purchase {

private let wrappedPurchase:Purchase;

private let options:[OPTION];

enum OPTION {

case GIFTWRAP;

case RIBBON;

case DELIVERY;

}

init(purchase:Purchase,options:OPTION...) {

self.wrappedPurchase = purchase;

self.options = options;

super.init(product: purchase.description,price: purchase.totalPrice);

}

override var description:String {

var result =wrappedPurchase.description;

for option inoptions {

switch (option) {

case .GIFTWRAP:

result ="\(result) + giftwrap";

case .RIBBON:

result ="\(result) + ribbon";

case .DELIVERY:

result ="\(result) + delivery";

}

}

return result;

}

override var totalPrice:Float {

var result =wrappedPurchase.totalPrice;

for option inoptions {

switch (option) {

case .GIFTWRAP:

result +=2;

case .RIBBON:

result +=1;

case .DELIVERY:

result +=5;

}

}

return result;

}

}


////

class DiscountDecorator:Purchase {

private let wrappedPurchase:Purchase;

init(purchase:Purchase) {

self.wrappedPurchase = purchase;

super.init(product: purchase.description,price: purchase.totalPrice);

}

override var description:String {

return super.description;

}

var discountAmount:Float {

return 0;

}

func countDiscounts() -> Int {

var total = 1;

if let discounter =wrappedPurchase as?DiscountDecorator {

total += discounter.countDiscounts();

}

return total;

}

}


class BlackFridayDecorator :DiscountDecorator {

override var totalPrice:Float {

returnsuper.totalPrice -discountAmount;

}

override var discountAmount:Float {

return super.totalPrice *0.20;

}

}


class EndOfLineDecorator :DiscountDecorator {

override var totalPrice:Float {

returnsuper.totalPrice -discountAmount;

}

override var discountAmount:Float {

return super.totalPrice *0.70;

}

}


////

import Foundation


class CustomerAccount {

let customerName:String;

var purchases = [Purchase]();

init(name:String) {

self.customerName = name;

}

func addPurchase(purchase:Purchase) {

self.purchases.append(purchase);

}

func printAccount() {

var total:Float =0;

for p in purchases {

total += p.totalPrice;

println("Purchase\(p),Price\(formatCurrencyString(p.totalPrice))");

}

println("Total due:\(formatCurrencyString(total))");

}

func formatCurrencyString(number:Float) ->String {

let formatter = NSNumberFormatter();

formatter.numberStyle =NSNumberFormatterStyle.CurrencyStyle;

return formatter.stringFromNumber(number) ??"";

}

}

相关文章

Swift 正式开源!Swift 团队很高兴宣布 Swift 开始开源新篇章。自从苹果发布 Swfit 编程语言,就成为了...
快,快,快!动动您的小手,分享给更多朋友! 苹果去年推出了全新的编程语言Swift,试图让iOS开发更简单...
开发者(KaiFaX) 面向开发者、程序员的专业平台! 和今年年初承诺的一样,苹果贴出了Swift语言的源码,...
本文由@Chun发表于Chun Tips :http://chun.tips/blog/2014/12/11/shi-yong-swift-gou-jian-zi-ding-yi...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...
本文由CocoaChina译者leon(社区ID)翻译 原文:THE RIGHT WAY TO WRITE A SINGLETON 在之前的帖子里聊过...