装饰器模式(Decorator)

装饰器模式说明

装饰器模式(Decorator)能够在运行时动态地为原始对象增加一些额外的功能,使其变得更加强大

装饰器模式可以将不同功能的单个模块规划至不同的装饰器类中,各装饰器类独立自主,各司其职。客户端可以根据自己的需求自由搭配各种装饰器,每加一层装饰就会有新的特性体现出来,巧妙的设计让功能模块层层叠加,装饰之上套装饰,最终使原始对象的特性动态地得到增强

类似俄罗斯套娃

需要明白两个概念:装饰器和装饰者

装饰者:boy, 实现了行为接口,具备了基本的行为

行为接口:

装饰器抽象类:对装饰器的抽象,并实现了行为接口

-装饰器实现类:调用装饰器父类构造器,注入装饰者,如“好看的皮囊”、“有趣的灵魂”

实例代码

package com.azure.design.decorator;

/**
 *  人类行为
 */
public interface Behavior {

    public void show();

}
package com.azure.design.decorator;

/**
 * 主角、装饰者,实现了行为接口
 */
public class Boy implements Behavior{

    @Override
    public void show() {
        System.out.print("boy");
    }
}
package com.azure.design.decorator;

/**
 *  装饰器抽象并实现了行为接口
 */
public abstract class Decorator implements Behavior{

    protected Behavior behavior;

    public Decorator(Behavior behavior) {
        this.behavior = behavior;
    }

    @Override
    public void show() {
        behavior.show();    // 直接调用不加任何装饰
    }
}
package com.azure.design.decorator;

/**
 * 好看的皮囊
 */
public class Skinbag extends Decorator{

    public Skinbag(Behavior behavior) {
        super(behavior);    // 调用父类的构造器注入
    }

    @Override
    public void show() {
        System.out.print("好看的皮囊【");
        behavior.show();
        System.out.print("】");
    }
}
package com.azure.design.decorator;

/**
 * 有趣的灵魂
 */
public class Soul extends Decorator{

    public Soul(Behavior behavior) {
        super(behavior);    // 调用父类的构造器注入
    }

    @Override
    public void show() {
        System.out.print("有趣的灵魂【");
        behavior.show();
        System.out.print("】");
    }
}
package com.azure.design.decorator;


import org.junit.Test;

public class Client {

    @Test
    public void testDecorator() {
        Skinbag boy = new Skinbag(new Soul(new Boy()));
        boy.show();
    }
}

// 输出
// 好看的皮囊【有趣的灵魂【大男孩】】

最终输出

// 输出
// 好看的皮囊【有趣的灵魂【boy】】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值