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. 旺旺!  
  • 相关阅读:
    WCF和Socket
    MBA-数学
    80端口被占用
    linux系统root密码忘了怎么办 三种方法快速找回root密码
    px、em、rem、%、vw、wh、vm等单位有什么区别?
    知道id如何进入
    查询两个时间段间隔多久的数据
    jsp中的判断
    判断手机登陆还是电脑登陆
    配置pom.xml、spring.xml、spring-mvc.xml、spring-mybatis.xml、web.xml
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7471527.html
Copyright © 2011-2022 走看看