## **模式的定义**
装饰器模式,也成为包装模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。
## **代码实现**
需求:在普通人类的基础上,增加超人的能力。
1. 定义一个Human接口
```
public interface Human {
// 跑步
void run();
}
```
2. 实现Man
```
public class Man implements Human {
@Override
public void run() {
System.out.println("人会跑步");
}
}
```
3. 创建Man装饰器对他进行装饰,添加可以飞翔的超能力
```
public class ManDecorator implements Human {
private Human human;
public ManDecorator(Human human) {
this.human = human;
}
private void fly() {
System.out.println("可以飞..");
}
@Override
public void run() {
human.run();
fly();
}
}
```
4. 创建SuperMan装饰器对他再进行装饰,添加可以定速巡航的超能力
```
public class SuperManDecorator implements Human {
private Human human;
public SuperManDecorator(Human human) {
this.human = human;
}
private void other() {
System.out.println("可以定速巡航");
}
@Override
public void run() {
human.run();
other();
}
}
```
5. 客户端调用
```
public static void main(String[] args) {
Human superMan = new ManDecorator(new Man());
superMan.run();
Human ssuperMan = new SuperManDecorator(superMan);
ssuperMan.run();
}
```
步骤3、4的代码几乎是一致的,那我们可以继续抽象代码
1. 定义装饰的抽象类
```
public abstract class AbstractDecorator implements Human {
private Human human;
public AbstractDecorator(Human human) {
this.human = human;
}
@Override
public void run() {
human.run();
}
}
```
2. 修改Man装饰器代码
```
public class ManDecorator extends AbstractDecorator {
public ManDecorator(Human human) {
super(human);
}
private void fly() {
System.out.println("可以飞..");
}
@Override
public void run() {
super.run();
fly();
}
}
```