顧名思義,裝飾模式就是給一個對象增長一些新的功能,並且是【動態】的,要求裝飾對象和被裝飾對象實現同一個接口,裝飾對象持有被裝飾對象的實例
這裏的動態指的是用戶能夠根據本身的需求把以前定好的功能任意組合。
JDK中的IO流部分就是典型的使用了裝飾模式,回憶一下BufferedReader對象的是如何建立的
例子:
//功能接口
public interface Action {
public void go();
}
//被裝飾的類 就是須要咱們裝飾的目標
public class Person implements Action{
public void go() {
System.out.println("我在走路");
}
}
//抽象的裝飾類
public abstract class Decorator implements Action{
private Action action;
public Decorator(Action action) {
this.action = action;
}
public void go() {
this.action.go();
}
}測試
//具體的裝飾類 能夠添加一個聽音樂的功能
public class ListenDecorator extends Decorator{
public ListenDecorator(Action action) {
super(action);
}
public void go() {
listen();//能夠在go方法【前】添加一個聽音樂的功能
super.go();
}
public void listen(){
System.out.println("我在聽音樂");
}
}this
//具體的裝飾類 能夠添加一個休息的功能
public class RelaxDecorator extends Decorator{
public RelaxDecorator(Action action) {
super(action);
}
public void go() {
super.go();
relax();//能夠在go方法【後】添加一個休息的功能
}
public void relax(){
System.out.println("我在休息");
}
}對象
//測試類
public class Test {
/*用戶能夠根據需求 任意給go方法添加聽音樂或者休息的功能*/
//Action a = new Person();
//Action a = new ListenDecorator(new Person());
//Action a = new RelaxDecorator(new Person());
//Action a = new RelaxDecorator(new ListenDecorator(new Person()));
Action a = new ListenDecorator(new RelaxDecorator(new Person()));
a.go();
} 接口
裝飾器模式的應用場景:
一、須要擴展一個類的功能。
二、動態的爲一個對象增長功能,並且還能動態撤銷。
缺點:產生過多類似的對象,不易排錯!io