zoukankan      html  css  js  c++  java
  • 设计模式之装饰器模式

    一 什么是装饰器模式

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

  • 相关阅读:
    2.Android之按钮Button和编辑框EditText学习
    《DSP using MATLAB》Problem 3.8
    《DSP using MATLAB》Problem 3.7
    《DSP using MATLAB》Problem 3.6
    《DSP using MATLAB》Problem 3.5
    《DSP using MATLAB》Problem 3.4
    《DSP using MATLAB》Problem 3.3
    《DSP using MATLAB》Problem 3.2
    《DSP using MATLAB》Problem 3.1
    《DSP using MATLAB》Problem 2.20
  • 原文地址:https://www.cnblogs.com/love-wzy/p/10240680.html
Copyright © 2011-2022 走看看