zoukankan      html  css  js  c++  java
  • 设计模式 — 结构型模式 装饰者模式

    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();
        }
    
    }
    
  • 相关阅读:
    增强MyEclipse提示功能
    Mysql安装配置,修改初试密码。
    在我的电脑里面创建图标
    popup non topmost
    多线程下载或上传数据限速
    SynchronizationContext
    linux运维笔记——常用命令详解diff
    linux运维笔记——curl
    linux下mysql的源码安装
    shell编程——变量的数值计算
  • 原文地址:https://www.cnblogs.com/sunshine-2015/p/6250617.html
Copyright © 2011-2022 走看看