## **模式的定義**
裝飾器模式,也成為包裝模式,顧名思義,就是對已經存在的某些類進行裝飾,以此來擴展一些功能。
## **代碼實現**
需求:在普通人類的基礎上,增加超人的能力。
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();
}
}
```