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

    装饰模式(Decorator)定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。

    这里的“不改变现有对象结构”主要是只“使用的是同一个对象”。

    装饰模式的优点有:

    1、采用装饰模式扩展对象的功能比采用继承方式更加灵活。

    2、可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。

    原始组件:

     1 public interface Component {
     2     public void Operation();
     3 }
     4 
     5 public class ConcreteComponent implements Component {
     6     @Override
     7     public void Operation() {
     8         // TODO Auto-generated method stub
     9         System.out.println("原件调用");
    10     }
    11 }

    装饰者:

     1 public abstract class Decorator implements Component {
     2     private Component component;
     3 
     4     public Decorator(Component component) {
     5         this.component = component;
     6     }
     7     
     8     public void Operation() {
     9         component.Operation();
    10     }
    11 }
    12 
    13 public class ConcreteDecoratorA extends Decorator {
    14     public ConcreteDecoratorA(Component component) {
    15         super(component);
    16         // TODO Auto-generated constructor stub
    17     }
    18     
    19     public void Operation() {
    20         super.Operation();
    21         addedFunction();
    22     }
    23 
    24     public void addedFunction() {
    25         System.out.println("添加具体装饰A");
    26     }
    27 }
    28 
    29 public class ConcreteDecoratorB extends Decorator {
    30     public ConcreteDecoratorB(Component component) {
    31         super(component);
    32         // TODO Auto-generated constructor stub
    33     }
    34     
    35     public void Operation() {
    36         super.Operation();
    37         addedFunction();
    38     }
    39 
    40     public void addedFunction() {
    41         System.out.println("添加具体装饰B");
    42     }
    43 }

    调用方式:

     1 public class Client {
     2     public static void main(String[] args) {
     3         //声明组件的对象p,在下面对p进行进一步的"完善"但是不更换p的类型。
     4         Component p = new ConcreteComponent();
     5         
     6         //未添加装饰的调用
     7         p.Operation();
     8         
     9         System.out.println("----------------------");
    10         //添加具体装饰A
    11         p = new ConcreteDecoratorA(p);
    12         p.Operation();
    13         
    14         System.out.println("----------------------");
    15         //在装饰A的基础上,再添加具体装饰B
    16         p = new ConcreteDecoratorB(p);
    17         p.Operation();
    18     }
    19 }

    执行结果:

    在调用方式中可以看到,始终使用的是Component p对象,将这个对象传入Decorator的实现类中,完成对这个对象的“装饰”。 

  • 相关阅读:
    Project Euler 613 Pythagorean Ant(概率+积分)
    Codeforces Beta Round #24 D. Broken robot (打表找规律)
    Codeforces Beta Round #17 D. Notepad (数论 + 广义欧拉定理降幂)
    bzoj4916-神犇和蒟蒻
    bzoj4176-Lucas的数论
    bzoj2788-Festival
    bzoj2839-集合计数
    bzoj1853-大包子的幸运数字
    bzoj3622-已经没有什么好害怕的的了
    bzoj2669-局部极小值
  • 原文地址:https://www.cnblogs.com/asenyang/p/12111044.html
Copyright © 2011-2022 走看看