设计模式(1)——装饰器模式

装饰器模式

可以理解为在不改变原有程序的前提下,向一个现有的对象添加新的修饰(功能)。
例如:原有程序实现的功能为“李青学习技能”,这时新的业务要求显示学习的具体技能,那么“学习什么技能”就是一个新的修饰。

具体实现

首先,创建一个接口 HeroAction

package DecoratorPattern;

public interface HeroAction {
    public void learnSkill();
}

然后,定义 Hero 实体类实现 HeroAction 接口

package DecoratorPattern;

public class Hero implements HeroAction{
    private String heroName;

    public Hero(String heroName) {
        this.heroName = heroName;
    }

    @Override
    public void learnSkill() {
        System.out.print("[" + heroName + "] 学习了技能");
    }
}

------ 到这里实现了原有功能“李青学习技能” ------
------ 下面开始对原有功能做修饰 ------

接着,定义抽象装饰类 SkillsDecorator 实现 HeroAction 接口(持有 HeroAction 接口对象)

package DecoratorPattern;

public abstract class SkillsDecorator implements HeroAction {
    private HeroAction heroAction;

    public SkillsDecorator(HeroAction heroAction) {
        this.heroAction = heroAction;
    }

    @Override
    public void learnSkill() {
        if (heroAction != null)
            heroAction.learnSkill();
    }
}

最后,实现该装饰类来修饰 HeroAction 对象(即学习了什么技能)

package DecoratorPattern;

public class SkillsDecoratorImpl extends SkillsDecorator {

    private String skillName;

    public SkillsDecoratorImpl(HeroAction heroAction, String skillName) {
        super(heroAction);
        this.skillName = skillName;
    }

    @Override
    public void learnSkill() {
        super.learnSkill();
        System.out.print(" [" + skillName + "]\n");
    }

}

测试

package DecoratorPattern;

public class main {
    public static void main(String[] args) {
        HeroAction hero = new Hero("李青");
        SkillsDecorator sd = new SkillsDecoratorImpl(hero, "Q: 天音波/回音击");
        sd.learnSkill();
    }
}

测试结果:


运行结果.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容