装饰者模式(Decorator Pattern)

一、装饰者模式简介

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))