码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式-10 装饰模式(结构型模式)

时间:2016-08-22 17:52:29      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

一 装饰模式

  装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

主要解决:扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

关键代码:1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。

使用场景:

孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能 
1、扩展一个类的功能。 2、动态增加功能,动态撤销

类图 :

 

技术分享

 

二 实现代码

1 创建一个Shape接口

Shape.java

public interface Shape {
    void draw();
}

2 创建实现接口的实体类

Rectangle.java 

public class Rectangle implements Shape {
    public void draw() {
        System.out.println("Shape: Rectangle");
    }
}

Circle.java

public class Circle implements Shape {
    public void draw() {
        System.out.println("Shape: Circle");
    }
}

3 创建实现了 Shape 接口的抽象装饰类

ShapeDecorator.java

public abstract class ShapeDecorator implements Shape {
    protected Shape decoratedShape;

    public ShapeDecorator(Shape decoratedShape) {
        this.decoratedShape = decoratedShape;
    }

    public void draw() {
        decoratedShape.draw();
    }
}

4 创建扩展了 ShapeDecorator 类的实体装饰类

RedShapeDecorator.java

public class RedShapeDecorator extends ShapeDecorator {
    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }

    public void draw() {
        decoratedShape.draw();
        setRedBorder(decoratedShape);
    }

    private void setRedBorder(Shape decoratedShape) {
        System.out.println("Border Color: Red");
    }
}

5 运行测试类

使用 RedShapeDecorator 来装饰 Shape 对象

public class DecoratorPatternDemo {
    public static void main(String[] args) {

        Shape circle = new Circle();

        Shape redCircle = new RedShapeDecorator(new Circle());

        Shape redRectangle = new RedShapeDecorator(new Rectangle());
        System.out.println("Circle with normal border");
        circle.draw();

        System.out.println("\nCircle of red border");
        redCircle.draw();

        System.out.println("\nRectangle of red border");
        redRectangle.draw();
    }
}

 

下一篇 设计模式-11 外观模式(结构型模式)

 

设计模式-10 装饰模式(结构型模式)

标签:

原文地址:http://www.cnblogs.com/wangshuo1/p/pattern_10.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!