zoukankan      html  css  js  c++  java
  • GoF23种设计模式之结构型模式之装饰模式

    一、概述

            动态地给一个对象添加一些额外的职责。装饰模式比生成子类更为灵活。

    二、适用性

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

    2.处理那些可以撤销的职责。

    3.当不能采用生成子类的方式进行扩展的时候。

    三、参与者

    1.Component:定义一个对象接口,可以给这些对象动态地添加职责。

    2.ConcreteComponent:定义一个对象,可以给这个对象添加一些职责。

    3.Decorator:维持一个指向Component对象的指针,并且定义一个与Component接口一致的接口。

    4.ConcreteDecorator:向组件添加职责。

    四、类图

    五、示例

    Component

    [java] view plain copy
     
     print?
    1. package cn.lynn.decorator;  
    2.   
    3. public interface IAnimal {  
    4.   
    5.     public void eat();  
    6.   
    7. }  

    ConcreteComponent

    [java] view plain copy
     
     print?
    1. package cn.lynn.decorator;  
    2.   
    3. public class Dog implements IAnimal {  
    4.   
    5.     @Override  
    6.     public void eat() {  
    7.         System.out.println("狗啃骨头!");  
    8.     }  
    9.   
    10. }  

    Decorator

    [java] view plain copy
     
     print?
    1. package cn.lynn.decorator;  
    2.   
    3. public abstract class Decorator implements IAnimal {  
    4.     private IAnimal animal;  
    5.   
    6.     public void setAnimal(IAnimal animal) {  
    7.         this.animal = animal;  
    8.     }  
    9.   
    10.     @Override  
    11.     public void eat() {  
    12.         animal.eat();  
    13.     }  
    14.   
    15. }  

    ConcreteDecorator

    [java] view plain copy
     
     print?
    1. package cn.lynn.decorator;  
    2.   
    3. public class DogDecoratorA extends Decorator {  
    4.   
    5.     @Override  
    6.     public void eat() {  
    7.         super.eat();  
    8.         transform();  
    9.     }  
    10.       
    11.     public void transform() {  
    12.         System.out.println("机器狗变形出发!");  
    13.     }  
    14. }  
    [java] view plain copy
     
     print?
    1. package cn.lynn.decorator;  
    2.   
    3. public class DogDecoratorB extends Decorator {  
    4.   
    5.     @Override  
    6.     public void eat() {  
    7.         super.eat();  
    8.         say();  
    9.     }  
    10.       
    11.     public void say() {  
    12.         System.out.println("旺旺!");  
    13.     }  
    14. }  

    Client

    [java] view plain copy
     
     print?
    1. package cn.lynn.decorator;  
    2.   
    3. public class Client {  
    4.   
    5.     public static void main(String[] args) {  
    6.         Dog dog = new Dog();  
    7.         DogDecoratorA dogDecoratorA = new DogDecoratorA();  
    8.         DogDecoratorB dogDecoratorB = new DogDecoratorB();  
    9.         dogDecoratorA.setAnimal(dog);  
    10.         dogDecoratorB.setAnimal(dogDecoratorA);  
    11.         dogDecoratorB.eat();  
    12.     }  
    13.   
    14. }  

    Result

    [java] view plain copy
     
     print?
    1. 狗啃骨头!  
    2. 机器狗变形出发!  
    3. 旺旺!  
  • 相关阅读:
    HDU 1850 Being a Good Boy in Spring Festival
    UESTC 1080 空心矩阵
    HDU 2491 Priest John's Busiest Day
    UVALive 6181
    ZOJ 2674 Strange Limit
    UVA 12532 Interval Product
    UESTC 1237 质因子分解
    UESTC 1014 Shot
    xe5 android listbox的 TMetropolisUIListBoxItem
    xe5 android tts(Text To Speech)
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7471527.html
Copyright © 2011-2022 走看看