装饰器模式


介绍

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

如何解决:将具体功能职责划分,同时继承装饰者模式。

应用实例: 1、孙悟空有 72 变,当他变成”庙宇”后,他的根本还是一只猴子,但是他又有了庙宇的功能。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。

与继承的区别:装饰器模式修饰哪个类似运行时才确认的,继承则是在编译期就已经确认。

使用

装饰者和被装饰者的共同父类:

public interface Hero {
    public void heroDesc();
}

具体的英雄:

public class Anivia implements Hero {
    @Override
    public void heroDesc() {
        System.out.println("艾尼维亚,");
    }
}

英雄的装饰者:

public abstract class SkinDecorator implements Hero {
    private Hero hero;

    public SkinDecorator(Hero hero) {
        this.hero = hero;
    }

    @Override
    public void heroDesc() {
        hero.heroDesc();
    }
}

具体的装饰者:

public class SkinA extends SkinDecorator {
    private Hero hero;

    public SkinA(Hero hero) {
        super(hero);
    }

    @Override
    public void heroDesc() {
        super.heroDesc();
        SkinDesc();
    }

    private void SkinDesc() {
        System.out.println("皮肤:双重冰晶,价格:8900点券");
    }
}
public class SkinB extends SkinDecorator {
    private Hero hero;

    public SkinA(Hero hero) {
        super(hero);
    }

    @Override
    public void heroDesc() {
        super.heroDesc();
        SkinDesc();
    }

    private void SkinDesc() {
        System.out.println("皮肤:千纸凤凰,价格:7900点券");
    }
}

测试:


   public static void main(String[] args) {
      Hero hero = new Hero();
      SkinA skinA = new SkinA(new Hero());
      SkinB skinB = new SkinB(new Hero());
      //英雄介绍
      hero.heroDesc();
      //皮肤A介绍
      skinA.heroDesc();
      //皮肤B介绍
      skinB.heroDesc();
   }
//艾尼维亚
//艾尼维亚
//皮肤:双重冰晶,价格:8900点券
//艾尼维亚
//皮肤:千纸凤凰,价格:7900点券

文章作者: kangshifu
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kangshifu !
 上一篇
适配器模式 适配器模式
介绍适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能
2019-11-23
下一篇 
Spring源码分析(五) 创建AOP代理 Spring源码分析(五) 创建AOP代理
入口 //AbstractAutowireCapableBeanFactory.java protected Object initializeBean(final String beanName, final Obje
2019-11-17
  目录