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 }
  • 相关阅读:
    JS框架_(Bootstrap.js)实现简单的轮播图
    Unity3D_(网格导航)简单物体自动寻路
    Android_(菜单)选项菜单
    Android_(传感器)获取手机中的传感器
    Java基础__Java中常用数学类Math那些事
    Java基础__Java中异常处理那些事
    Android_(控件)动态添加或删除Spinner下拉菜单
    Android_(消息提示)多种使用Toast的消息提示
    Java基础__随机生成1~15之间不重复的数字
    Android_(自动化)获取手机存储卡的容量
  • 原文地址:https://www.cnblogs.com/agilestyle/p/11409608.html
Copyright © 2011-2022 走看看