美文网首页技术栈
2019-02-27——设计模式 装饰器模式

2019-02-27——设计模式 装饰器模式

作者: 烟雨乱平生 | 来源:发表于2019-02-27 22:44 被阅读0次

    特点

    动态地给对象增加一些职责,即增加其额外的功能。

    主要角色

    • 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
    • 具体构件(Concrete Component)角色:实现抽象构件,通过装饰角色为其添加一些职责。
    • 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
    • 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。

    实现

    public interface Component {
        void method();
    }
    
    
    public class ConcreateComponent implements Component {
        @Override
        public void method() {
    
        }
    }
    
    
    public abstract class Decorator implements Component {
        protected Component component;
        Decorator(Component component){
            this.component = component;
        }
    }
    
    
    public class ConcreteDecorator extends Decorator {
        public ConcreteDecorator(Component component) {
            super(component);
        }
    
        @Override
        public void method() {
            System.out.println("other action");
            this.component.method();
        }
    }
    

    装饰器模式看起来和代理模式在代码上没有什么差别,其实代理模式的关注点是对真实对象的隐藏,不会扩展新的功能;而装饰器模式是对具体构件的装饰,并对具体构件进行包装,以扩展新的功能。装饰者能够在运行时递归地被构造

    public class ConcreteAfterDecorator extends Decorator {
        public ConcreteAfterDecorator(Component component) {
            super(component);
        }
    
        @Override
        public void method() {
            this.component.method();
            System.out.println("after");
        }
    }
    
    
    public class ConcreteBeforeDecorator extends Decorator {
        public ConcreteBeforeDecorator(Component component) {
            super(component);
        }
    
        @Override
        public void method() {
            System.out.println("before");
            this.component.method();
        }
    }
    
    
    public class T {
        public static void main(String[] args) {
            Decorator decorator = new ConcreteAfterDecorator(new ConcreteBeforeDecorator(new ConcreateComponent()));
            decorator.method();
        }
    }
    

    在该例中装饰器的构造被层层包装,递归构造。

    相关文章

      网友评论

        本文标题:2019-02-27——设计模式 装饰器模式

        本文链接:https://www.haomeiwen.com/subject/zgkquqtx.html