返回首页
一、概述
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类