常用设计模式之装饰者模式
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是【动态】的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例
这里的动态指的是用户可以根据自己的需求把之前定好的功能任意组合。
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("我在听音乐");
}
}
//具体的装饰类 可以添加一个休息的功能
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();
}
装饰器模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。
缺点:产生过多相似的对象,不易排错!