0
点赞
收藏
分享

微信扫一扫

装饰器模式(Decorator)

Just_Esme 2022-04-13 阅读 94

装饰器模式说明

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

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

类似俄罗斯套娃

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

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

行为接口:

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

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

实例代码

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("大男孩");
    }
}
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();
    }
}

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

最终输出

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

举报

相关推荐

0 条评论