装饰器模式介绍
看到装饰器三个字,一目了然,表达的是在一个事物原有的基础上,以不修改它原有的内容为前提,为其添加一些装饰品。在程序中,装饰模式的作用是在不改变一个对象原有结构的基础上,为其扩展新的功能。打个比方说,现在要开发一个功能,这个功能要实现为一条蛇装上四条腿,让这条蛇跑的更快,暂且就将这个需求称之为画蛇添足计划吧。
要实现为一条小蛇添加四条腿,首先要先创建一个需要被添加腿的小蛇,也就是需要被装饰的对象。其次,要创建一个装饰器,实现为小蛇加四条腿。
装饰器模式示例代码
创建一个表示蛇的抽象类
/**
* 表示蛇的抽象类
*/
public interface SnakeAbstract {
/**
* 蛇的行为
*/
void action();
}
这个抽象类定义了一个表示小蛇行为的抽象方法
创建一个表示蛇的具体类
/**
* 表示蛇的具体类
*/
public class Snake implements SnakeAbstract{
@Override
public void action() {
System.out.println("一条蛇在吐信子");
}
}
具体类实现了抽象类的行为方法,描述了现在有一条蛇正在"吐信子"。现在有个人不满足只看蛇吐信子,还想看小蛇四条腿走路,于是一把拽住小蛇,给其装了四条腿。我们就将这个人当作是这条蛇的装饰者吧。
创建小蛇的装饰器类
/**
* 蛇的装饰器
*/
public class SnakeDecorator implements SnakeAbstract{
private SnakeAbstract snake;
public SnakeDecorator(SnakeAbstract snake) {
this.snake = snake;
}
@Override
public void action() {
snake.action();
}
/**
* 一条蛇正在用四条腿走路
*/
public void otherAction() {
snake.action();
System.out.println("这条小蛇蛇正在用四条腿走路");
}
}
在装饰器类中,通过一个构造函数拿到表示小蛇的具体对象,又在类中定义了一个扩展其行为方法otherAction()
,这个方法保留了小蛇原有的行为,紧接着为其扩展了新的行为。
装饰器模式测试
public class test_01 {
public static void main(String[] args) {
new SnakeDecorator(new Snake()).otherAction();
}
}
运行结果:
运行结果显示了小蛇原有的行为以及使用装饰器为其扩展的行为。现在已经成功的通过装饰器模式让小蛇实现了四条腿走路。
总结
当需要实现在原有功能的基础上扩展新的功能时,建议使用装饰器模式。该设计模式不会改变一个类原有的功能,而是通过装饰器将原有的类对象进行包装,再在装饰器中为其提供额外的功能,降低了代码的耦合度。并且,可以选择创建多个装饰器提供更多的额外功能,而不是为其创建子类,所以装饰器模式提高了程序的灵活性,同时也提供了一种扩展对象功能的新方法。