博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象结构设计模式(2) - 组合模式(Composite), 装饰模式(Decorator)
阅读量:6084 次
发布时间:2019-06-20

本文共 1508 字,大约阅读时间需要 5 分钟。

hot3.png

组合模式

    将对象组合成树形结构,表示整体和部件的层次结构。
   
interface Drawable {        void draw();    }        // 表示整体的canvas类    class Canvas : Drawable {        Drawable _items[];                void draw() {            foreach item in _items {                item.draw();            }        }    }        // 表示部件的类    class Line : Drawable {        void draw () { /* draw line */}    }    class Text : Drawable {        void draw() { /* draw text */}    }    class Rectangle : Drawable {        void draw() { /* draw rectangle */}    }        // 使用方式    main() {        Canvas canvas;        canvas._items[0] = new Line;        canvas._items[1] = new Text;        canvas._items[2] = new Rectangle;        canvas.draw();    }

装饰模式

    动态给对象添加一些额外的职责。
    例如,现有一个绘制固定宽度线条的类,现在需要将其扩展为可动态设置宽度。
   
interface Drawable {        void draw();    }    class Line : Drawable {        void draw () { /* 绘制固定宽度线条*/}    }        class LineDecorator : Drawable {        Line _line;                LineDecorator(int width) { /* 构造时设置当前画笔宽度*/ }                void draw() {            /* 应用当前画笔宽度 */            _line.draw();  // 绘制线条        }    }        // 使用: 绘制线条函数    void drawLine(Drawable line) {        line.draw();    }    main() {        // 只能绘制固定长度先挑        Drawable line1 = new Line;        drawLine(line1);                // 可以修改线条宽度        Drawable line2 = new LineDecorator(5);        drawLine(line2);    }

  组合模式与装饰模式对比

    
    同:不改变对象的对外接口,只修改或扩展接口的实现。
    异:组合模式在保持接口一致的前提下,用于对多个部件类的统一处理。
        装饰模式仅针对特定的一个类对象进行扩展。

转载于:https://my.oschina.net/luckysym/blog/184651

你可能感兴趣的文章
3、Spring Cloud - Eureka(高可用Eureka Server集群)
查看>>
NHibernate初学者指南(7):映射模型到数据库之方式三
查看>>
asp.net mvc + mongodb 实践
查看>>
迅雷高速通道被举报无法下载问题
查看>>
媒体查询使用方法@media
查看>>
vue --- 生命周期
查看>>
[转载] 七龙珠第一部——第078话 神龙再度出现
查看>>
[转载] 财经郎眼20120728:“李宁”怎么了?
查看>>
LeetCode 329. Longest Increasing Path in a Matrix
查看>>
ArcGIS10拓扑规则-面规则(转)
查看>>
GCD基本知识
查看>>
65. Valid Number
查看>>
deepin安装Mariadb后,登录时出现ERROR 1045 (28000): Access denied for user 'root'@'localhost'
查看>>
VScode中支持Python虚拟环境
查看>>
递推,动态规划(DP),字符串处理,最佳加法表达式
查看>>
Poj(3615),Floyd,最大值中的最小值
查看>>
[BZOJ3398] [Usaco2009 Feb]Bullcow 牡牛和牝牛(动态规划)
查看>>
PHP下实现两种ajax跨域的解决方案之jsonp
查看>>
BEM样式使用规范
查看>>
Swift - 3.0 去掉 C 风格循环
查看>>