设计模式 — 结构型模式 装饰者模式

Decorate

动态的将需要的逻辑添加在对象的现有方法上,提供了比继承更有弹性的替代方案

目的

动态给一个对象添加逻辑(不使用继承)

实现方式

  • 装饰者和被装饰者继承自同一个超类
  • 装饰者作为一个abstract类,其他decorator继承他
  • 在装饰者中调用被装饰者的方法,所以在构造装饰者的时候必须传入被装饰者
  • 每一个decorator调用父类的方法,然后再完成自己的逻辑
  • 使用的时候需要被装饰者作为参数传入装饰器decorator中
  • 可以进行多层装饰

缺点

  • 增加很多小类,造成理解起来困难,AfterDecorator,BeforeDecorator
  • 装饰者可能存在很多个,在实例化的时候,不容易确定需要实例化哪些,Decorator decorator = new AfterDecorator(new BeforeDecorator(component));

实例

Java IO

Java SDK中的IO使用了装饰者模式

UML图

装饰者模式UML图

代码实现

package org.lep.test.decorator;

public interface Component {
    public void sleep();

}

package org.lep.test.decorator;

/**
 * 类ConcreateComponent的实现描述:TODO 类实现描述
 *
 * @author lack 2017/1/3 17:12
 */
public class ConcreateComponent implements Component {

    @Override
    public void sleep() {
        System.out.println("I am sleeping");
    }
}

package org.lep.test.decorator;

/**
 * 类Decorator的实现描述:TODO 类实现描述
 *
 * @author lack 2017/1/3 17:14
 */
public abstract class Decorator implements Component {
    private Component component;



    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void sleep() {
        component.sleep();
    }
}

package org.lep.test.decorator;

/**
 * 类ClothDecorator的实现描述:TODO 类实现描述
 *
 * @author lack 2017/1/3 17:17
 */
public class AfterDecorator extends Decorator {

    public AfterDecorator(Component component){
        super(component);
    }

    @Override
    public void sleep(){
        super.sleep();
        System.out.println("睡觉后。。。");
    }

}

package org.lep.test.decorator;

/**
 * 类ClothDecorator的实现描述:TODO 类实现描述
 *
 * @author lack 2017/1/3 17:17
 */
public class BeforeDecorator extends Decorator {

    public BeforeDecorator(Component component){
        super(component);
    }

    @Override
    public void sleep(){
        System.out.println("睡觉前。。。");
        super.sleep();
    }

}

package org.lep.test.decorator;

/**
 * 类Test的实现描述:TODO 类实现描述
 *
 * @author lack 2017/1/3 17:27
 */
public class Test {

    public static void main(String[] args) {
        Component component = new ConcreateComponent();
        Decorator decorator = new AfterDecorator(new BeforeDecorator(component));
        decorator.sleep();
    }

}
posted @ 2017-01-04 23:09  lacker  阅读(234)  评论(0编辑  收藏  举报