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

一、定义

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

二、设计类图

三、作用

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

四、代码实现

/**
 * 基础的接口
 * @Author: jiaqing.xu@hand-china.com
 * @Date: 2019-11-12 09:22
 */
public interface Apple {
	void res();
}
/**
 * 实现接口具体的类
 *
 * @Author: jiaqing.xu@hand-china.com
 * @Date: 2019-11-12 09:23
 */
public class ConcreteApple implements Apple {
    @Override
    public void res() {
        System.out.println("普通苹果");
    }
}
/**
 * 装饰器基类
 *
 * @Author: jiaqing.xu@hand-china.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: jiaqing.xu@hand-china.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: jiaqing.xu@hand-china.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: jiaqing.xu@hand-china.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扩展的功能,我是绿色的苹果.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值