设计模式之装饰器模式

一 什么是装饰器模式

  装饰者模式(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 分别对原始类和装饰类做扩展是为不会彼此影响

原文地址:https://www.cnblogs.com/love-wzy/p/10240680.html