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


    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();
        }
    
    }
    
  • 相关阅读:
    poj 2728 Desert King(最小比率生成树,迭代法)
    HDU
    hud 2089 不要62 (数位dp)
    食物链(带全并查集)
    docNet基础学完感想
    zoj 1081 (改进的弧长算法)(转)
    zoj 1962 How Many Fibs?(字符串化为数字处理)
    zoj 1109 zoj 1109 Language of FatMouse(字典树)
    iOS开发网络数据之AFNetworking使用
    iOS 使用AFNetworking
  • 原文地址:https://www.cnblogs.com/sunshine-2015/p/6250617.html
Copyright © 2020-2023  润新知