美文网首页
装饰者模式(Decorator Pattern)

装饰者模式(Decorator Pattern)

作者: lxbnjupt | 来源:发表于2018-08-06 15:09 被阅读0次

    一、装饰者模式简介

    1. 定义

    装饰者模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构,该设计模式属于结构型模式。这种设计模式创建一个装饰类,用来包装原有的类,在装饰类中既可以调用待装饰类原有的方法,还可以增加新的方法,以扩充原有类的功能。因此,装饰者模式是一种用于替代继承的技术。

    2. 模式组成

    • Component:一个抽象类或者一个接口,定义了属性或者方法,是ConcreteComponent和ConcreteDecorator的共同父类;
    • ConcreteComponent:Component子类,实现相应的方法,是“被装饰者”角色;
    • Decorator:抽象装饰类,维护一个指向ConcreteComponent对象的引用,通过该引用可以调用装饰之前的方法,并通过其子类扩展该方法,以达到装饰的目的;
    • ConcreteDecorator:具体装饰类,是抽象装饰类的子类,负责添加新的功能。

    二、装饰者模式实现

    这里以王者荣耀里面给英雄穿戴皮肤为例,如果英雄穿戴了皮肤,那么ta将会有一定的皮肤加成,也就是说会变得更强一些。具体,以百里守约说明一下:

    /**
     * Component
     * 一个接口:英雄
     */
    public interface Hero {
        public void skills();
    }
    /**
     * ConcreteComponent
     * 具体英雄:百里守约
     */
    public class BailiShouYue implements Hero {
        @Override
        public void skills() {
            System.out.println("我瞄准很强!");
        }
    }
    /**
     * Decorator
     * 抽象装饰类:装饰英雄
     */
    public class HeroDecorator implements Hero {
    
        protected Hero mHero;
    
        public HeroDecorator(Hero hero) {
            this.mHero = hero;
        }
    
        @Override
        public void skills() {
            mHero.skills();
        }
    }
    /**
     * ConcreteDecorator
     * 具体装饰类:穿戴皮肤
     */
    public class SkinDecorator extends HeroDecorator {
    
        public SkinDecorator(Hero hero) {
            super(hero);
        }
    
        @Override
        public void skills() {
            super.skills();
            System.out.println("穿上「特工魅影」的我更强了!");
        }
    }
    

    测试代码如下:

    private void testDecorator() {
            Hero bailiShouYue = new BailiShouYue();
            SkinDecorator skinDecorator = new SkinDecorator(bailiShouYue);
            skinDecorator.skills();
        }
    

    输出结果:

    我瞄准很强!
    穿上「特工魅影」的我更强了!
    

    三、优缺点

    1. 优点

    • 装饰模式比继承更加灵活性,不会导致类的个数急剧增加;
    • 装饰模式可以动态扩展一个实现类的功能。

    2. 缺点

    • 多层装饰比较复杂。

    相关文章

      网友评论

          本文标题:装饰者模式(Decorator Pattern)

          本文链接:https://www.haomeiwen.com/subject/uyywvftx.html