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. 旺旺!  
posted @ 2017-09-03 22:48  皇问天  阅读(168)  评论(0编辑  收藏  举报