• java设计模式之装饰器模式


    装饰器模式和代理模式非常相似,都是用来增强原始类的功能,只不过代理类增加了是业务逻辑之外无关的的功能。

    装饰器是在基础功能上的继续增强相关的功能。

    我们通过一个一个画笔的设计,通过装饰器模式给画笔添加新功能

    首先定义了一个抽象类

    public abstract class Pen {
        public abstract void draw();
    }

    其次我们定义一个铅笔类

    /**
     * 普通的铅笔
     */
    public class Pencil extends Pen{
        @Override
        public void draw() {
            System.out.println("Pencil.draw()");
        }
    }

    单纯一个铅笔也画不好一幅画,如果能有多个彩色铅笔就更好了

    /**
     * 给铅笔新增加了颜色功能
     */
    public class ColorDecorator extends Pen{
        protected Pen pen;
    
        public ColorDecorator(Pen pen) {
            this.pen = pen;
        }
    
        @Override
        public void draw() {
            System.out.print("RedColor ");
            pen.draw();
        }
    }

    有颜色挺好,如果线条的粗细可以调整就更好了,那我们在给铅笔装饰一个线条粗细的功能

    /**
     * 给铅笔新增了线条宽度的功能
     */
    public class WidthDecorator extends Pen{
        protected Pen pen;
    
        public WidthDecorator(Pen pen) {
            this.pen = pen;
        }
    
    
        @Override
        public void draw() {
            System.out.print("Width ");
            pen.draw();
        }
    }

    OK,这下就可以开始画画了

    public class Board {
        public static void main(String[] args) {
            Pencil pencil = new Pencil();
            pencil.draw();
            ColorDecorator colorDecorator = new ColorDecorator(pencil);
            colorDecorator.draw();
            WidthDecorator widthDecorator = new WidthDecorator(colorDecorator);
            widthDecorator.draw();
        }
    }

    我们既可以使用普通的铅笔画画,也可以不断添加新的功能。

    输出:

    Pencil.draw()
    RedColor Pencil.draw()
    Width RedColor Pencil.draw()
  • 相关阅读:
    Php排序
    php导出excel表
    yii的多表查询
    MySQL中自定义排序
    jquery中的obj.attr()和obj.data
    PhpStorm快捷键
    记2019年目标之一没有996的大数据分析BI实战历程
    2018年传统公司技术部门技术变迁和2019展望
    mpvue微信小程序开发随笔
    docker toolbox的redis 配置主从及哨兵模式保证高可用
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15859519.html
Copyright © 2020-2023  润新知