一 什么是装饰器模式
装饰者模式(Decorator Pattern),是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。其中值得我们注意的有以下3点:
1 不改变原类文件;
2 不使用继承;
3 动态扩展对象功能。
结构图如下:
父类接口Component提供统一的接口方法,具体的实现类ConcreteComponent做原始的接口方法的实现;
父类装饰器实现父类接口提供的接口方法,并通过构造方法管理一个接口实现类实例,具体实现的装饰器类(装饰器子类)来动态扩展(装饰)接口实现类原始类。
二 装饰器模式实现
1 定义接口Soldier,提供统一方法 war
1 public interface Soldier { 2 /** 3 * 实现类要实现的方法 4 */ 5 void war(); 6 7 }
2 接口实现类ChineseSoldier实现Soldier接口,做方法的具体实现
1 public class ChineseSoldier implements Soldier { 2 3 @Override 4 public void war() { 5 System.out.println("中国士兵上战场,参加反恐战争"); 6 } 7 8 }
3 定义父类装饰器SoldierDecorator实现Soldier接口,并管理一个接口实现类
1 public abstract class SoldierDecorator implements Soldier { 2 /** 3 * 原始实现类 4 */ 5 protected Soldier soldier; 6 7 public SoldierDecorator(Soldier soldier) { 8 this.soldier = soldier; 9 } 10 11 @Override 12 public void war() { 13 soldier.war(); 14 } 15 16 }
4 子类装饰器ChineseSoldierDecorator继承父类装饰器SoldierDecorator,对接口方法做动态扩展
1 public class ChineseSoldierDecorator extends SoldierDecorator { 2 3 public ChineseSoldierDecorator(Soldier soldier) { 4 super(soldier); 5 } 6 7 @Override 8 public void war() { 9 //做扩展 10 ext(); 11 super.war(); 12 } 13 14 private void ext() { 15 System.out.println("<<----装饰士兵:带上头盔,穿上防弹衣---->>"); 16 } 17 18 }
5 测试
1 public static void main(String[] args) { 2 3 System.out.println("-------------装饰前-------------"); 4 Soldier soldier = new ChineseSoldier(); 5 soldier.war(); 6 7 System.out.println("-------------装饰后-------------"); 8 soldier = new ChineseSoldierDecorator(soldier); 9 soldier.war(); 10 11 }
执行结果如下
在以上的代码中我们可以看到,1 装饰器类没有破坏(修改)到原始的实现类,2 没有使用继承原始类,3 在子类装饰器中对实现类方法做了动态的扩展,4 分别对原始类和装饰类做扩展是为不会彼此影响