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

    设计模式--装饰器模式

    1 概述


    1.1 定义
    装饰器模式(Decorator Design)动态的扩展一个对象的功能。论扩展功能而言,装饰器提供了比继承更有弹性的替代方案。

    1.2 应用
    JDK中的java.io包就使用的装饰器来扩展IO接口。

    1.2 类图
    enter description here

     

    1. Component抽象组件角色:定义我们最核心的抽象对象。
    2. ConcreteComponent具体组件角色:定义最核心抽象对象的实现,你要装饰的对象就是它。
    3. Decorator装饰角色:装饰的抽象对象,其有一个私有的变量指向Component抽象组件。
    4. ConcreteDecorator具体装饰角色:具体的装饰对象,用来装饰组件。

    2 详解


    Component 抽象构件

    1 public abstract class Component {
    2     // 抽象方法
    3     public abstract void operate();
    4 }

    ConcreteComponent 具体构件-->你要装饰的具体对象

    1 public class ConcreteComponent extends Component {
    2     @Override
    3     public void operate() {
    4         System.out.println("ConcreteComponent.operate()");
    5     }
    6 }

    Decorator 抽象的装饰者-->需要接受一个具体的需要被装饰的对象

     1 public abstract class Decorator extends Component {
     2     private Component component;
     3 
     4     // 通过构造函数传递被装饰者
     5     Decorator(Component component) {
     6         this.component = component;
     7     }
     8 
     9     // 委托被装饰者执行
    10     @Override
    11     public void operate() {
    12         component.operate();
    13     }
    14 }

    ConcreteDecoratorA、ConcreteDecoratorB 具体的装饰者

     1 public class ConcreteDecoratorA extends Decorator {
     2     // 定义被被装饰者
     3     ConcreteDecoratorA(Component component) {
     4         super(component);
     5     }
     6 
     7     // 重写父类的operate方法, 以用来定义自己的装饰行为
     8     @Override
     9     public void operate() {
    10         System.out.println("ConcreteDecoratorA do some operate");
    11         super.operate();
    12     }
    13 }
    14 
    15 public class ConcreteDecoratorB extends Decorator {
    16     // 定义被装饰者
    17     ConcreteDecoratorB(Component component) {
    18         super(component);
    19     }
    20     // 重写父类的operate方法,以用来定义自己的装饰行为
    21     @Override
    22     public void operate() {
    23         System.out.println("ConcreteDecoratorB do some operate");
    24         super.operate();
    25     }
    26 }

    测试

     1 public class Client {
     2     public static void main(String[] args) {
     3         Component component = new ConcreteComponent();
     4         component.operate();
     5         System.out.println("-------------------------------------");
     6         // 使用ConcreteDecoratorA装饰原对象
     7         Component component1 = new ConcreteDecoratorA(component);
     8         component1.operate();
     9         System.out.println("-------------------------------------");
    10         // 使用ConcreteDecoratorB装饰原对象
    11         Component component2 = new ConcreteDecoratorB(component);
    12         component2.operate();
    13         System.out.println("-------------------------------------");
    14         // 先使用ConcreteDecoratorA装饰对象,再使用ConcreteDecoratorB装饰对象
    15         Component component3 = new ConcreteDecoratorB(new ConcreteDecoratorA(component));
    16         component3.operate();
    17     }
    18 }output:
    19 ConcreteComponent.operate()
    20 -------------------------------------
    21 ConcreteDecoratorA do some operate
    22 ConcreteComponent.operate()
    23 -------------------------------------
    24 ConcreteDecoratorB do some operate
    25 ConcreteComponent.operate()
    26 -------------------------------------
    27 ConcreteDecoratorB do some operate
    28 ConcreteDecoratorA do some operate
    29 ConcreteComponent.operate()

    3 应用

    java.io类包中就是使用了装饰器设计模式来装饰,避免过多的使用继承,但也造成了API繁琐。

    自己写的IO装饰者--->UpperCaseInputStream(小写字符转换成大写字符)

     1 public class UpperCaseInputStream extends FilterInputStream {
     2 
     3     protected UpperCaseInputStream(InputStream in) {
     4         super(in);
     5     }
     6 
     7     public int readCharToUpperCase() throws IOException {
     8         int c = read();
     9         return c == -1 ? c : Character.toUpperCase(c);
    10     }
    11 }
    12 
    13 public class Client {
    14     public static void main(String[] args) throws Exception {
    15         UpperCaseInputStream in = new UpperCaseInputStream(
    16                 new BufferedInputStream(new FileInputStream("E:\java\America.java")));
    17         int c;
    18         while((c = in.readCharToUpperCase()) != -1) {
    19             System.out.print((char) c);
    20         }
    21     }
    22 }
  • 相关阅读:
    Finer Resolution Observation and Monitoring -Global Land Cover更精细的分辨率观测和监测-全球土地覆盖
    MapServer教程3
    手写Tomcat源码
    室内无线局域网
    基于点云的3ds Max快速精细三维建模方法及系统的制作方法 插件开发
    Web Mapping Illustrated Using Open Source GIS Toolkits
    apache Internal Server Error 解决方法
    php命令行工具
    小程序:将gbk转为utf-8
    java FileUtil(文件操作类)
  • 原文地址:https://www.cnblogs.com/maying3010/p/6623401.html
Copyright © 2011-2022 走看看