装饰器模式

Posted 51life

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器模式相关的知识,希望对你有一定的参考价值。

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




以上是关于装饰器模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之装饰器模式

装饰器模式问题 - 如何调用嵌套装饰器方法?

学习设计模式之装饰器模式

装饰器模式

PHP 装饰器模式

设计模式之装饰器模式