zoukankan      html  css  js  c++  java
  • 设计模式-装饰器模式

    设计模式-装饰器模式

    定义

    是指在不改变原来对象的基础上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能)。

    属于结构型。

    适用场景

    • 用于扩展一个类的功能或给一个类添加附加职责
    • 动态的给一个对象添加功能,这些功能可以再动态撤销

    UML 类图

    image

    装饰器和被装饰对象都继承统一父类 Component

    image

    代码实现

    package com.black.design.pattern.decorator;
    
    /**
     * 父类组件
     * @author black
     *
     */
    public abstract class Component {
    
        //操作
        public  abstract void operation();
    }
    
    
    package com.black.design.pattern.decorator;
    
    /**
     * 被装饰者
     * @author black
     *
     */
    public class ConcreteComponent extends Component {
    
        @Override
        public void operation() {
           System.out.println("做工作...");
        }
    
    }
    
    
    package com.black.design.pattern.decorator;
    
    /**
     * 装饰器
     * @author black
     *
     */
    public abstract class Decorator extends Component {
        
        private Component component;
    
        public Decorator(Component c) {
            this.component = c;
        }
        
        @Override
        public void operation() {
            component.operation();
        }
    
    }
    
    
    package com.black.design.pattern.decorator;
    /**
     * 工作渴了,喝口可乐
     * @author black
     *
     */
    public class ConreteDecoratorDrink extends Decorator {
    
        public ConreteDecoratorDrink(Component c) {
            super(c);
        }
        
        @Override
        public void operation() {
            super.operation();
            System.out.println("这会儿有点渴了,喝了一口可乐;");
        }
        
    
        public void operationFirst() {
            System.out.println("第一步,首先...");
        }
        
        public void operationLast() {
            System.out.println("最后,...");
        }
    }
    
    
    package com.black.design.pattern.decorator;
    /**
     * 好记性不如烂笔头,记一下笔记;
     * @author black
     *
     */
    public class ConreteDecoratorNote extends Decorator {
    
        public ConreteDecoratorNote(Component c) {
            super(c);
        }
        
        @Override
        public void operation() {
            super.operation();
            System.out.println("好记性不如烂笔头,记一下笔记;");
        }
    }
    
    

    测试:

    package com.black.design.pattern.decorator;
    
    public class Client {
    
        public static void main(String[] args) {
            
            Component p;
            p= new ConcreteComponent();//先工作
            p = new ConreteDecoratorNote(p);//实时记笔记
            p = new ConreteDecoratorDrink(p);//喝口可乐
            p.operation();
        }
    }
    
    
    

    结果:

    做工作...
    好记性不如烂笔头,记一下笔记;
    这会儿有点渴了,喝了一口可乐;
    

    优缺点

    优点:
    装饰器是继承的有力补充,比继承更灵活。
    通过使用不同的装饰类以及这些装饰类的排列组合,可实现不同的效果。
    装饰器完全符合开闭原则。

    缺点:
    会产生更多的类,增加程序复杂性;
    动态装饰,多层装饰时会很复杂。

    本文来自博客园,作者:不安分的黑娃,转载请注明原文链接:https://www.cnblogs.com/lihw-study/p/15154827.html

  • 相关阅读:
    hdu 3790 最短路径问题
    hdu 2112 HDU Today
    最短路问题 以hdu1874为例
    hdu 1690 Bus System Floyd
    hdu 2066 一个人的旅行
    hdu 2680 Choose the best route
    hdu 1596 find the safest road
    hdu 1869 六度分离
    hdu 3339 In Action
    序列化和反序列化
  • 原文地址:https://www.cnblogs.com/lihw-study/p/15154827.html
Copyright © 2011-2022 走看看