天天看点

23设计模式之装饰模式(Decorator) 一、概述二、适用性三、参与者四、类图 五、代码实现 六、测试

返回首页

 一、概述

        Decorator属于结构型模式中的一种,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

二、适用性

        1. 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。         2. 处理那些可以撤消的职责。         3. 当不能采用生成子类的方法进行扩充时。

三、参与者

        1. Component:定义一个对象接口,可以给这些对象动态地添加职责。         2. ConcreteComponent:定义一个对象,可以给这个对象添加一些职责。         3. Decorator:维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。         4. ConcreteDecorator:向组件添加职责。

四、类图 

23设计模式之装饰模式(Decorator) 一、概述二、适用性三、参与者四、类图 五、代码实现 六、测试

五、代码实现 

1. Component:定义一个对象接口,可以给这些对象动态地添加职责。

PersonDe.swift

//
//  PersonDe.swift
//  23设计模式
//
//  Created by 阳君 on 14/12/3.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// PersonDe定义一个对象接口,可以给这些对象动态地添加职责。
protocol PersonDe {
    
    func eat()
    
}
           

2. ConcreteComponent:定义一个对象,可以给这个对象添加一些职责。

ManDe.swift

//
//  ManDe.swift
//  23设计模式
//
//  Created by 阳君 on 14/12/3.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// ManDe定义一个对象,可以给这个对象添加一些职责
class ManDe: PersonDe {
    
    func eat() {
        print("男人在吃")
    }
    
}
           

3. Decorator:维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。

Decorator.swift

//
//  Decorator.swift
//  23设计模式
//
//  Created by 阳君 on 14/12/3.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// Decorator维持一个指向Component对象的指针,并定义一个与PersonDe接口一致的接口
class Decorator: PersonDe {
    
    /// 接口对象,等待实现
    var personDe:PersonDe?
    
    init(){
        
    }
    
    func eat() {
        personDe?.eat()
    }
    
}
           

4. ConcreteDecorator:向组件添加职责。

a) ManDecoratorA.swift

//
//  ManDecoratorA.swift
//  23设计模式
//
//  Created by 阳君 on 14/12/3.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// ManDecoratorA向组件添加职责
class ManDecoratorA: Decorator {
    
    override func eat() {
        super.eat()
        self.reEat()
        print("ManDecoratorA类");
    }
    
    func reEat() {
        print("再吃一顿饭")
    }
    
}
           

b) ManDecoratorB.swift

//
//  ManDecoratorB.swift
//  23设计模式
//
//  Created by 阳君 on 14/12/3.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// ManDecoratorB向组件添加职责
class ManDecoratorB: Decorator {
    
    override func eat() {
        super.eat();
        print("===============");
        print("ManDecoratorB类");
    }
    
}
           

六、测试

1. 代码

// 装饰模式
let man = ManDe()
let md1 = ManDecoratorA()
let md2 = ManDecoratorB()
md1.personDe = man
md2.personDe = md1
md2.eat()
           

2. 运行结果

男人在吃

再吃一顿饭

ManDecoratorA类

===============

ManDecoratorB类

继续阅读