• 设计模式(6)---装饰器模式


    装饰器模式  Decorator (结构型模式)

    1.概述

      装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。例如:为了快速地从InputStream流读取数据,我们使用BufferedInputStream装饰该流,被它装饰过的流便增加了缓冲数据的功能。装饰器模式可以让我们在运行时动态地增强对象的功能,而不影响客户程序的使用。

    2.结构图

    3.代码

    1 /*
    2  * 公共接口
    3  */
    4 public abstract class Component {
    5 
    6     public abstract void operation();
    7 
    8 }
     1 /*
     2  * 这是一个被包装的类
     3  */
     4 public class ConcreteComponent extends Component {
     5 
     6     @Override
     7     public void operation() {
     8         System.out.println("盘子上有    ");
     9         
    10     }
    11     
    12 }
     1 /*
     2  * 装饰器接口
     3  */
     4 public abstract class Decorator extends Component {
     5 
     6     protected Component component;
     7     
     8     public Decorator(Component component) {  
     9             this.component = component;  
    10     }
    11 
    12     @Override
    13     public void operation() {
    14         component.operation(); 
    15     }
    16 }

    以下是3个具体的装饰物

     1 public class Orange extends Decorator {
     2 
     3     public Orange(Component component) {
     4         super(component);
     5         // TODO Auto-generated constructor stub
     6     }
     7     
     8     @Override
     9     public void operation() {
    10         super.operation();
    11         System.out.println("橘子  ");
    12     }
    13 
    14 }
     1 public class Banana extends Decorator {
     2 
     3     public Banana(Component component) {
     4         super(component);
     5         // TODO Auto-generated constructor stub
     6     }
     7     
     8     @Override
     9     public void operation() {
    10         super.operation();
    11         System.out.println("香蕉  ");
    12     }
    13 
    14 }
     1 public class Watermelon extends Decorator {
     2 
     3     public Watermelon(Component component) {
     4         super(component);
     5     }
     6     
     7     @Override
     8     public void operation() {
     9         super.operation();
    10         System.out.println("西瓜  ");
    11     }
    12 
    13 }
     1 public class Test {
     2 
     3     public static void main(String[] args) {
     4         //盘子上有香蕉  橘子
     5         Component component = new Orange(new Banana(new ConcreteComponent())) ;
     6         component.operation();
     7         
     8         //盘子上有橘子  西瓜
     9         component = new Watermelon(new Orange(new ConcreteComponent())) ;
    10         component.operation();
    11 
    12     }
    13 
    14 }

    4.适用场合

      (1)需要在不影响其他对象的情况下,以动态、透明的方式给对象添加职责。

      (2)如果不适合使用子类来进行扩展的时候,可以考虑使用装饰器模式。

  • 相关阅读:
    uva11916 Emoogle Grid (BSGS)
    2016vijos 1-2 股神小L(堆)
    bzoj千题计划311:bzoj5017: [Snoi2017]炸弹(线段树优化tarjan构图)
    Oracle Profile 使用详解--zhuanzai
    通过srvctl add命令添加database信息到srvctl管理器-转
    Oracle Dataguard Standby Redo Log的两个实验
    MySQL数据的主从复制、半同步复制和主主复制详解-转
    解决oralce 11g dg搭建报错:ORA-16664、ORA-16714、ORA-16810问题--转
    oracle分布式事务总结-转载
    日志挖掘Logmnr
  • 原文地址:https://www.cnblogs.com/mengchunchen/p/5745199.html
Copyright © 2020-2023  润新知