4. 装饰器模式(Decorator)

本文深入探讨装饰器模式的优点和缺点,展示如何通过该模式增强对象的功能而无需修改其结构,适用于希望了解装饰器模式实现原理及其在软件设计中应用的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 装饰器模式(Decorator)

优点:

  1. 比静态继承更加灵活;
  2. 接口和被装饰的类保持一致,对Client无感 ;使用起来就像没有修饰易用性
  3. 可以产生叠加效果; 可以重复修饰一个对象,也可以使用不同的装饰器修饰相同的对象,产生叠加效果
  4. 可以作为AOP的简单实现,在调用被修饰对象之前可以调用其他功能

缺点:

1.产生许多的小对象
2.对象的功能和修饰类相关,不易排错
3.特别需要注意覆写equals()和HashCode()


必要条件

1.被修饰class的最好抽象一个接口,由修饰类和被修饰类共同实现;(强迫被实现被修饰类的和修饰类统一接口
2.修饰类中存放被修饰类的接口成员变量;(方便替换被修饰的类,和被修饰类的方法的调用)

由被装饰类抽象出的接口
package demo.spring.boot.demospringboot;

import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 被修饰类抽象出的接口
 */
interface IBeDecoatorred {
    void execute(String param);

    IBeDecoatorred setiBeDecoatorred(IBeDecoatorred iBeDecoatorred);
}

/**
 * 被修饰类的实现
 */
class IBeDecoatorredImpl implements IBeDecoatorred {
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void execute(String param) {
        logger.info("execute:{}", param);
    }

    @Override
    public IBeDecoatorred setiBeDecoatorred(IBeDecoatorred iBeDecoatorred) {
        return null;
    }
}

/**
 * 代理class1 -> 检查参数
 */
class DecoratorModel1 implements IBeDecoatorred {

    /**
     * 被修饰的对象
     */
    private IBeDecoatorred iBeDecoatorred;

    @Override
    public IBeDecoatorred setiBeDecoatorred(IBeDecoatorred iBeDecoatorred) {
        this.iBeDecoatorred = iBeDecoatorred;
        return this;
    }

    @Override
    public void execute(String param) {
        if (StringUtils.isNotBlank(param)) {
            iBeDecoatorred.execute(param);
        }
    }
}

/**
 * 代理class1 -> 调用其他逻辑
 */
class DecoratorModel2 implements IBeDecoatorred {

    private IBeDecoatorred iBeDecoatorred;

    @Override
    public IBeDecoatorred setiBeDecoatorred(IBeDecoatorred iBeDecoatorred) {
        this.iBeDecoatorred = iBeDecoatorred;
        return this;
    }

    /**
     * 被修饰的方法 --> 和被修饰类的方法保持一致 -> 对Client无感
     */
    @Override
    public void execute(String param) {
        this.before();
        this.iBeDecoatorred.execute(param);
        this.after();
    }

    //调用前处理逻辑
    private void before() {
        //to do something before ...
    }

    private void after() {
        // to do something after ...
    }
}

public class Decorator {
    @Test
    public void test() {
        IBeDecoatorred iBeDecoatorred = new IBeDecoatorredImpl();
        //model1代理iBeDecoatorred
        IBeDecoatorred model1 = new DecoratorModel1().setiBeDecoatorred(iBeDecoatorred);
        //model2代理model1 -> 叠加代理
        IBeDecoatorred model2 = new DecoratorModel2().setiBeDecoatorred(model1);
        model2.execute("param");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值