对象结构设计模式(2) - 组合模式(Composite), 装饰模式(Decorator)

组合模式

    将对象组合成树形结构,表示整体和部件的层次结构。
   
    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);
    }



  组合模式与装饰模式对比

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

你可能感兴趣的:(设计模式,装饰模式,组合模式)