23设计模式之装饰模式(Decorator)



 一、概述

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

二、适用性

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

三、参与者

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

四、类图 



五、代码实现 

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值