加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift - The Decorator Pattern

发布时间:2020-12-14 01:55:37 所属栏目:百科 来源:网络整理
导读:装饰者模式:多个类派生于一个基础类,这几个类可以嵌套构造来装饰。 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 c

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

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) ??"";

}

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读