您的位置:首页 > 移动开发 > Swift

swift - The Decorator Pattern

2015-08-12 22:08 447 查看
装饰者模式:多个类派生于一个基础类,这几个类可以嵌套构造来装饰。

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) ??"";
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: