顾名思义,装饰模式就是给一个对象增长一些新的功能,并且是【动态】的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
这里的动态指的是用户能够根据本身的需求把以前定好的功能任意组合。
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