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();
        }
    
    }
    
  • 相关阅读:
    Mybatis配置文件中Insert 元素标签添加配置有哪些呢?
    Mybatis配置文件中Select元素标签输入参数有多少种输入方式呢?
    Mybatis配置文件如何进行配置呢?
    Centos安装 Apache Benchmark
    本地连接阿里云上的mysql centos
    python 导出项目需要的库
    Nginx报错:nginx: [error] OpenEvent("Global gx_reload_14944") failed (2: The system cannot find the file specified)
    windows安装uwsgi报错 AttributeError: module 'os' has no attribute 'uname'
    P3346 [ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
    P6139 【模板】广义后缀自动机(广义 SAM)
  • 原文地址:https://www.cnblogs.com/sunshine-2015/p/6250617.html
Copyright © 2011-2022 走看看