美文网首页工作生活
设计模式(三) Composite

设计模式(三) Composite

作者: jianshudxw | 来源:发表于2019-07-01 16:17 被阅读0次

定义:

将对象组合成树形结构以表示“部分-整体”的层次结构。 组合使得用户对单个对象和组合对象的使用具体一致性。

  • 结构性模式
  • 使用于树形结构
    案例
class Part {
    let name: String;
    let price: Float;
    
    init(name: String, price: Float) {
        self.name = name;
        self.price = price;
    }
}

class CompositePart {
    let name: String;
    let parts: [Part];
    
    init(name: String, parts: Part...) {
        self.name = name;
        self.parts = parts;
    }
}

class CustomerOrder {
    let customer: String;
    let parts: [Part];
    let compositeParts: [CompositePart];
    
    init(customer: String, parts: [Part], composites: [CompositePart]) {
        self.customer = customer;
        self.parts = parts;
        self.compositeParts = composites;
    }
    
    var totalPrice :Float {
        let partReducer = { (subtotal: Float, part: Part)-> Float in
            return subtotal + part.price;
        };
        
        let total = parts.reduce(0, partReducer);
        return compositeParts.reduce(total){ (subtotal, cpart) -> Float in
            return cpart.parts.reduce(subtotal, partReducer);
        };
    }
    
    func printDetails() {
        print("Oreder for \(customer): Cost: \(totalPrice)");
    }
}



let doorWindow = CompositePart(name: "DoorWindow",parts:
                                Part(name: "Window", price: 100.50),
                                Part(name: "Window Switch", price: 12));

let door = CompositePart(name: "Door", parts:
                        Part(name: "Window", price: 100.50),
                        Part(name: "Door Loom", price: 80),
                        Part(name: "Window Switch", price: 12),
                        Part(name: "Door Handles", price: 43.40))

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

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

order.printDetails();

组合模式 重构


protocol CartPart {
    var name: String { get };
    var price: Float { get };
}

class Part : CartPart {
    let name: String;
    let price: Float;
    
    init(name: String, price: Float) {
        self.name = name;
        self.price = price;
    }
}

class CompositePart : CartPart {
    let name: String;
    let parts: [CartPart];
    
    init(name: String, parts: CartPart...) {
        self.name = name;
        self.parts = parts;
    }
    
    var price: Float {
        return parts.reduce(0, { (subtotal, part) in
            return subtotal + part.price;
        });
    }
}

class CustomerOrder {
    let customer: String;
    let parts: [CartPart];
    
    init(customer: String, parts: [CartPart]) {
        self.customer = customer;
        self.parts = parts;
    }
    
    var totalPrice :Float {
        return parts.reduce(0, { (subtoal, part) in
            return subtoal + part.price;
        })
    }
    
    func printDetails() {
        print("Oreder for \(customer): Cost: \(totalPrice)");
    }
}

let doorWindow = CompositePart(name: "DoorWindow",parts:
                                Part(name: "Window", price: 100.50),
                                Part(name: "Window Switch", price: 12));

let door = CompositePart(name: "Door", parts:
                        Part(name: "Window", price: 100.50),
                        Part(name: "Door Loom", price: 80),
                        Part(name: "Window Switch", price: 12),
                        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();

总结

  • 这个模式主要是找到“部分”
  • 要有好的封装能力

相关文章

  • 设计模式(三) Composite

    定义: 将对象组合成树形结构以表示“部分-整体”的层次结构。 组合使得用户对单个对象和组合对象的使用具体一致性。 ...

  • Java设计模式之08_Composite(组合模式)

    更多Java设计模式:Java设计模式-目录 一、定义 组合模式(Composite Pattern)也叫合成模式...

  • 设计模式-composite

    组合模式适用于特殊的场景,在这种场景下对象是按照树的方式组织的。 例子 例如说文件和文件夹,一个根目录下有若干文件...

  • Composite模式(设计模式)

    中心主旨:容器与内容的一致性。能够让容器和内容具有一致性,创造出递归结构的模式。 比如:文件夹里面可以放文件和文件...

  • 设计模式之组合模式(Composite 模式)

    引入composite模式 composite模式的实例 composite模式的分析 小结 引入composit...

  • Typescript 组合模式(Composite)

    标签: 前端 设计模式 组合模式 typescript composite 请仔细阅读下面代码,理解其中的设计理念...

  • 设计模式[11]-组合模式-Composite Pattern

    1. 组合模式简介 组合模式(Composite Pattern)是结构性设计模式,又叫“部分-整体”模式,主要用...

  • 组合模式

    设计模式 一、什么是组合模式 组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“...

  • 设计模式-组合模式(Composite)

    定义将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. ...

  • 设计模式-组合模式(Composite)

    组合模式有时又叫部分-整体模式,在处理类似树形结构的问题时比较方便。 看看关系图: 直接来看代码: 使用场景:将多...

网友评论

    本文标题:设计模式(三) Composite

    本文链接:https://www.haomeiwen.com/subject/nbxgcctx.html