swift - The Composite Pattern

It shows you how the composite pattern can be used so that different kinds of objects in a tree data structure can be treated consistently.


复合模式:

这个设计模式为你展示了不同类型的在树中的数据结构如何一致的对待。



client:

let doorWindow = CompositePart(name: "DoorWindow",parts:

Part(name: "Window",price: 100.50),

Part(name: "Window Switch",price: 12));


let door = CompositePart(name: "Door",parts:

doorWindow,

Part(name: "Door Loom",price: 80),

Part(name: "Door Handles",price: 43.40));


let hood = Part(name: "Hood",price: 320);


let order = CustomerOrder(customer: "Bob",parts: [hood, door,doorWindow]);

order.printDetails();



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

pattern:

protocol CarPart {

var name:String { get };

var price:Float { get };

func addPart(part:CarPart) -> Void;

func removePart(part:CarPart) -> Void;

}


class Part : CarPart {

let name:String;

let price:Float;

init(name:String,price:Float) {

self.name = name; self.price = price;

}

func addPart(part: CarPart) {

// do nothing

}

func removePart(part: CarPart) {

// do nothing

}

}



class CompositePart : CarPart {

let name:String;

private var parts:[CarPart];

init(name:String,parts:CarPart...) {

self.name = name; self.parts = parts;

}

var price:Float {

return reduce(parts,0,{subtotal,part in

return subtotal + part.price;

});

}

func addPart(part:CarPart) {

parts.append(part);

}

func removePart(part:CarPart) {

for index in 0 ..< parts.count {

if (parts[index].name == part.name) {

parts.removeAtIndex(index);

break;

}

}

}

}


////

import Foundation


class CustomerOrder {

let customer:String;

let parts:[CarPart];

init(customer:String,parts:[CarPart]) {

self.customer = customer;

self.parts = parts;

}

var totalPrice:Float {

return reduce(parts,part in

return subtotal + part.price});

}

func printDetails() {

println("Order for \(customer): Cost: \(formatCurrencyString(totalPrice))");

}

func formatCurrencyString(number:Float) -> String {

let formatter = NSNumberFormatter();

formatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle;

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

}

}

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...