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

  • 相关阅读:
    Node.js入门 Hello World
    Select自动下拉实现
    js从url截取参数(简写)
    如何关闭SQL Server受影响行数
    适用于多种查询结果集的分页(不要存储过程,简单易懂)
    单条件存储过程分页(SQL Server)&WS调用(只是其中一种 实现的方法还有很多)
    Simple Package Tool 学习
    Python try/except/finally等
    Python os.path模块
    《UVM实战》代码示例
  • 原文地址:https://www.cnblogs.com/love-wzy/p/10240680.html
Copyright © 2011-2022 走看看