zoukankan      html  css  js  c++  java
  • 装饰模式Decorator

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11409608.html

    1. 定义
    动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活。

    2. 结构图

    Component:组件对象的接口,可以给这些对象动态地添加职责。
    ConcreteComponent:具体的组件对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责。
    Decorator:所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰的对象。注意这个被装饰的对象不一定是最原始的那个对象,也可能是被其他装饰器装饰过后的对象,反正都是实现的同一个接口,也就是同一类型。
    ConcreteDecorator:实际的装饰器对象,实现具体要向被装饰器对象添加的功能。

    3. 本质
    装饰模式的本质:动态组合。

    4. Code Demo

    Component.java

    1 package org.fool.dp.decorator;
    2 
    3 public interface Component {
    4     void doSomething();
    5 }

    ConcreteComponent.java

    1 package org.fool.dp.decorator;
    2 
    3 public class ConcreteComponent implements Component {
    4     @Override
    5     public void doSomething() {
    6         System.out.println("function A");
    7     }
    8 }

    Decorator.java

     1 package org.fool.dp.decorator;
     2 
     3 public class Decorator implements Component {
     4     private Component component;
     5 
     6     public Decorator(Component component) {
     7         this.component = component;
     8     }
     9 
    10     @Override
    11     public void doSomething() {
    12         component.doSomething();
    13     }
    14 }

    ConcreteDecorator1.java

     1 package org.fool.dp.decorator;
     2 
     3 public class ConcreteDecorator1 extends Decorator {
     4     public ConcreteDecorator1(Component component) {
     5         super(component);
     6     }
     7 
     8     @Override
     9     public void doSomething() {
    10         super.doSomething();
    11 
    12         doAnotherThing();
    13     }
    14 
    15     private void doAnotherThing() {
    16         System.out.println("function B");
    17     }
    18 }

    ConcreteDecorator2.java

     1 package org.fool.dp.decorator;
     2 
     3 public class ConcreteDecorator2 extends Decorator {
     4     public ConcreteDecorator2(Component component) {
     5         super(component);
     6     }
     7 
     8     @Override
     9     public void doSomething() {
    10         super.doSomething();
    11 
    12         doAnotherThing();
    13     }
    14 
    15     private void doAnotherThing() {
    16         System.out.println("function C");
    17     }
    18 }

    Client.java

    1 package org.fool.dp.decorator;
    2 
    3 public class Client {
    4     public static void main(String[] args) {
    5         Component component = new ConcreteDecorator2(new ConcreteDecorator1(new ConcreteComponent()));
    6 
    7         component.doSomething();
    8     }
    9 }
  • 相关阅读:
    szoj657 【AHSDFZNOI 7.2 WuHongxun】Odd
    cogs2652 秘术「天文密葬法」
    bzoj1026 [SCOI2009]windy数
    bzoj1862/1056: [Zjoi2006]GameZ游戏排名系统
    java-PreparedStatement的用法
    java-JDBC登录注册代码
    java-String Date Calendar之间的转换
    java-如何用eclipse打包jar
    java-通过JDBC操作数据库
    java-JDBC配置驱动程序
  • 原文地址:https://www.cnblogs.com/agilestyle/p/11409608.html
Copyright © 2011-2022 走看看