swift - The Decorator Pattern

发布时间:2020-05-20 发布网站:脚本之家
脚本之家收集整理的这篇文章主要介绍了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 - The Decorator Pattern全部内容,希望文章能够帮你解决swift - The Decorator Pattern所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入脚本之家官方QQ群:1065694478
脚本之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!