Java-23个设计模式 Decorator装饰者模式

本文介绍装饰者模式的基本概念,通过创建抽象组件和具体组件,利用装饰类动态为对象添加职责,提高代码灵活性。示例展示了如何为不同对象添加穿衣行为。

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

Decorator:

        动态(组合)地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活(继承)

① 创建Component组件(Human)

/**
 * 抽象类,人类
 */
public abstract class Human {
    // 跑
    abstract void run();
}

② 创建具体对象ConcreteComponent(Man和Woman)

public class Man extends Human {
    @Override
    void run() {
        System.out.println("Man没穿衣服在跑");
    }
}
public class Woman extends Human {
    @Override
    void run() {
        System.out.println("Woman没穿衣服在跑");
    }
}

③ 创建Decorator(HumanDecorator)中间件

/**
 * 同时继承+组合(Decorator)
 */
public class HumanDecorator extends Human {
    // 组合,将来支持实现(woman/man/?)
    private Human decoratorHuman;
    public HumanDecorator(Human decoratorHuman){
        this.decoratorHuman = decoratorHuman;
    }

    @Override
    void run() {
        /**
         * 实现类在调用是,是在运行期间确定Huam传入的对象
         * 来判断是man或者woman执行run
         */
        decoratorHuman.run();
    }

④ 创建 具体类ConcreteDecorator(DressTousers和DressJacket)

public class DressTrousers extends HumanDecorator {
    // 运行时,根据创建的man/woman选择子对象
    public DressTrousers(Human decoratorHuman) {
        super(decoratorHuman);
    }

    //
    public void runDecorator(){
        super.run();
        System.out.println("穿条裤子");
    }

}
public class DressJacket extends HumanDecorator {

    public DressJacket(Human decoratorHuman) {
        super(decoratorHuman);
    }

    //
    public void runDecorator(){
        super.run();
        System.out.println("穿条上衣");
    }
}

⑤ 测试(这里的话举例Man对象,用DressJack(穿上衣)进行修饰)

public class Test {
    public static void main(String[] args) {
        // 创建man
        Man man = new Man();
        System.out.println("正常:");
        man.run();
        System.out.println("---------------");
        DressJacket dressJacket = new DressJacket(man);
        System.out.println("装饰者调用,不添加职责:");
        dressJacket.run();
        System.out.println("---------------");
        System.out.println("装饰者调用,添加职责:");
        dressJacket.runDecorator();
        System.out.println("---------------");
    }
}

结果:
正常:
Man没穿衣服在跑
---------------
装饰者调用,不添加职责:
Man没穿衣服在跑
---------------
装饰者调用,添加职责:
Man没穿衣服在跑
穿条上衣

优点:若需要对man添加更多的职责,使用Decorator只需要对Decorator进行扩展。如果用继承的话,需要进行多次继承,增加             大量新的类。在装饰类越多的情况下越明显。

           组件可以自由组合,从简单到困难,即在需要的时候定义(实现特殊的功能,而不是复杂的特征)。

缺点:使用装饰时不应该依赖对象标识

          有许多小对象,容易定制但很难排错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值