欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

软件设计模式——装饰器模式

程序员文章站 2024-02-26 12:49:16
...

一、定义

装饰器模式是为已有的模式动态地添加额外的功能的一种模式。允许向一个现有的对象添加新的功能,但是不影响其结构。作为现有对象的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

二、设计类图

软件设计模式——装饰器模式

三、作用

一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

四、代码实现

/**
 * 基础的接口
 * @Author: aaa@qq.com
 * @Date: 2019-11-12 09:22
 */
public interface Apple {
	void res();
}
/**
 * 实现接口具体的类
 *
 * @Author: aaa@qq.com
 * @Date: 2019-11-12 09:23
 */
public class ConcreteApple implements Apple {
    @Override
    public void res() {
        System.out.println("普通苹果");
    }
}
/**
 * 装饰器基类
 *
 * @Author: aaa@qq.com
 * @Date: 2019-11-12 09:24
 */
public abstract class Decorator implements Apple {

    protected Apple apple;

    public Decorator(Apple apple) {
        this.apple = apple;
    }

    @Override
    public void res() {
        apple.res();
    }
}
/**
 * 具体的装饰类的实现类
 *
 * @Author: aaa@qq.com
 * @Date: 2019-11-12 09:26
 */
public class ConcreteDecoratorA extends Decorator {

    public ConcreteDecoratorA(Apple apple) {
        super(apple);
    }

    public void resA() {
        System.out.println("被装饰器A扩展的功能,我是红色的苹果.");
    }

    @Override
    public void res() {
        super.res();
        //在重写原有方法时 装饰了一个resA方法
        resA();
    }
}
/**
 * 具体的装饰类的实现类
 *
 * @Author: aaa@qq.com
 * @Date: 2019-11-12 09:27
 */
public class ConcreteDecoratorB extends Decorator {

    public ConcreteDecoratorB(Apple apple) {
        super(apple);
    }

    public void resB() {
        System.out.println("被装饰器B扩展的功能,我是绿色的苹果.");
    }

    @Override
    public void res() {
        super.res();
        resB();
    }
}
/**
 * 主类测试
 *
 * @Author: aaa@qq.com
 * @Date: 2019-11-12 09:28
 */
public class Main {
    public static void main(String[] args) {
        Apple apple = new ConcreteApple();
        //原来的方法
        apple.res();

        //装饰出红色的苹果
        ConcreteDecoratorA decoratorA = new ConcreteDecoratorA(apple);
        decoratorA.res();

        //装饰后的方法 装饰出绿色的苹果
        ConcreteDecoratorB decoratorB = new ConcreteDecoratorB(apple);
        decoratorB.res();
    }
}

输出结果:

普通苹果
普通苹果
被装饰器A扩展的功能,我是红色的苹果.
普通苹果
被装饰器B扩展的功能,我是绿色的苹果.

 

相关标签: 软件设计模式