装饰者模式是一种对象结构型模式,其意图是动态地给一个对象添加一些额外的职责。
一、装饰者模式的基本介绍
1.1 意图
动态地给一个对象添加额外的职责。
1.2 结构
装饰者模式的基本结构如下:
定义一个对象接口,可以给这些对象动态地添加职责。
定义一个对象,可以给这个对象添加一些职责。
装饰角色,持有一个Component对象的实例,并定义一个与Componnet接口一致的接口。
具体装饰角色,负责给组件添加职责。
二、装饰者模式示例
西游记中的孙悟空,具有七十二般变化,给我们留下了深刻的印象,他的每一种变化都给他带来了一种新的本领。他变成鱼儿时,就可以到水里游泳;他变成雀儿,就可以在天上飞行。
下面我们就以齐天大圣的例子来完成一个装饰者模式的例子:
package com.wangmengjun.tutorial.designpattern.decorator;
public interface TheGreatestSage {
void move();
}
package com.wangmengjun.tutorial.designpattern.decorator;
public class Change implements TheGreatestSage {
private TheGreatestSage sage;
public Change(TheGreatestSage sage) {
this.sage = sage;
}
public void move() {
sage.move();
}
}
package com.wangmengjun.tutorial.designpattern.decorator;
public class Monkey implements TheGreatestSage {
public void move() {
System.out.println("Monkey move~~");
}
}
package com.wangmengjun.tutorial.designpattern.decorator;
public class Bird extends Change {
public Bird(TheGreatestSage sage) {
super(sage);
}
@Override
public void move() {
System.out.println("Bird move~~");
}
}
package com.wangmengjun.tutorial.designpattern.decorator;
public class Fish extends Change {
public Fish(TheGreatestSage sage) {
super(sage);
}
@Override
public void move() {
System.out.println("Fish move~~");
}
}
对象包装示例:
package com.wangmengjun.tutorial.designpattern.decorator;
public class Client {
public static void main(String[] args) {
TheGreatestSage sage = new Monkey();
/**
* 单层封装
*/
TheGreatestSage bird = new Bird(sage);
//bird.move();
TheGreatestSage fish = new Fish(bird);
//fish.move();
/**
* 多层封装
*/
TheGreatestSage fish2 = new Fish(new Bird(sage));
fish2.move();
}
}
这种方式是否似曾相识 ?
大家回忆一下JDK中的io流的创建方式是否也是如此。一个InpuStream的简单结构如下:
new BufferedReader(new FileReader("F:\\test.txt"));
三、小结
3.1 适用场景
在以下 情况下可以使用装饰模式:
3.2 优点 vs 缺点
优点
缺点