装饰器模式

1 介绍:

1.1 概念:装饰器模式允许向一个现有的对象添加新功能,同时又不改变其结构。这种模式创建了一个装饰类,来包装原有的类,在保证方法签名完整的情况下,添加了额外的功能。

1.2 优缺点:

     优点:装饰类和被装饰类独立发展,互不影响,装饰器模式是继承的一个很好的代替模式,可以很好的扩展一个实现类的功能。

     缺点:多层装饰比较复杂

2.实现:

我们创建一个Shape接口和它的两个实现类Circle,Rectangle;然后创建一个实现了Shape接口的装饰抽象类DecoratorShape,并把shape对象作为它的变量,其实就是作为被装饰类。然后创建装饰类RedShapeDecorator继承了DecoratorShape。

Shape接口:

public interface Shape {
    void draw();
}

Circle类:

// 被装饰类
public
class Circle implements Shape{ public void draw() { System.out.println("circle"); } }

Rectangle类:

// 被装饰类
public
class Rectangle implements Shape{ public void draw() { System.out.println("rectangle"); } }

DecoratorShape抽象装饰类:

/**
 * @author chenyk
 * @date 2018年9月7日
 * 抽象装饰类
 */

public abstract class DecoratorShape implements Shape {
    
    //被装饰的类
    protected Shape decoratedShape;
    
    public DecoratorShape(Shape decoratedShape){
        this.decoratedShape = decoratedShape;
    }
    
    public void draw() {
        decoratedShape.draw();
    }

}

RedShapeDecorator装饰类:

public class RedShapeDecorator extends DecoratorShape{

    public RedShapeDecorator(Shape decoratedShape) {
        super(decoratedShape);
    }
    
    //在不改变被装饰类原有的方法下,又添加了新的方法
    public void draw(){
        decoratedShape.draw();
        setRedBorder();
    }

    //装饰类中额外的功能
    public void setRedBorder(){
        System.out.println("Border color:red");
    }
    
    
}

在场景类中运行:

public class DecoratorClient {
    public static void main(String[] args) {
// 装饰类包装了被装饰类,在不改变被装饰类的基础上,添加了额外的功能 Shape redCircle
= new RedShapeDecorator(new Circle()); Shape redRectangle = new RedShapeDecorator(new Rectangle()); redCircle.draw(); redRectangle.draw(); } }

 

原文出处:http://www.runoob.com/design-pattern/decorator-pattern.html

posted @ 2018-09-07 15:18  51life  阅读(151)  评论(0编辑  收藏  举报