装饰器模式就是给对象添加一些额外的实现,就像房子装修一样,本来已经成型的实现,现在要给它做一些装饰,实现更多的功能。
三个注意点:
1、装饰器必须要装饰一个对象
2、装饰器对象与被装饰对象必须要实现同一个接口
3、通过写入新的方法增强被装饰对象的功能
------------------------这种思想是不是很像spring的AOP,切入增强。
下面以例子具体说说:
首先建立一个接口
package decorator;
public interface InterF {
int mod(int num);
}
此接口需要返回一个int型的值,java的接口方法必须都是public的,所以public关键字可以省掉不写
下面针对这个接口写实现方法,这个方法是最初的实现,可能像下面这样
package decorator;
public class Hours implements InterF {
@Override
public int mod(int num) {
if (num < 0) {
System.out.println("请输入大于等于0的数字");
return 0;
}
return num % 2;
}
}
我们可以把装饰器模式比作一个房子,现在我们先定义的房子的实现,这个方法返回num%2的值。很简单。
然后装饰器登场,我们需要对这个房子进行一些装饰,也告知调用者一些新的东西,具体实现可能会是下面这样
package decorator;
public class Decorator implements InterF {
private InterF interF;
public void setInterF(InterF interF) {
this.interF = interF;
}
@Override
public int mod(int num) {
// TODO Auto-generated method stub
System.out.println("Start to mod...");
return interF.mod(num);
}
}
注意,我们先在这个装饰器中申明了一个私有的InterF,然后写了一个setInterF方法导入外部实现了接口InterF的具体对象,然后装饰类自己也实现了InterF接口的mod方法,接着我们在调用外部对象方法之前加入了增强实现,此处我们告知用户下面开始mod了
下面写个测试类
package decorator;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Decorator decorator=new Decorator();
Hours hours=new Hours();
decorator.setInterF(hours);
System.out.println(hours.mod(4));
System.out.println("-----------------------------");
System.out.println(decorator.mod(4));
}
}
你可以看到结果如下:
0
-----------------------------
Start to mod...
0
总结:我个人觉得装饰器这种设计模式相对是较为简单的,使用的方式也很像spring的AOP,在真正要实现的方法的前后写入增强,丰富我们的方法。当然,实际上,也是可以直接修改原Hours类写入相关的增强功能,但是这就有可能破坏我们之前的封装,显得不是很必要,或许装饰器实现也只是一种临时实现。
引申一下,装饰器对象和被装饰对象都实现了同一个接口,个人认为极大限制了类的能力,只能简单的在原方法的基础上,增加装饰,此例中,如果我想把经过装饰的Hours由返回1或者0,改为返回Boolean型的值,需要怎么做?