JAVA设计模式——(六)装饰模式(Decorator Pattern)

发布于:2025-05-01 ⋅ 阅读:(9) ⋅ 点赞:(0)

JAVA设计模式——(六)装饰模式(Decorator Pattern)

介绍

动态给一个对象添加一些额外的功能,动态的扩展其功能。

理解

装饰模式,可以方便的扩展一些类的功能。其实现方式更像是一种托管方式,用于将被装饰的类的功能托管给装饰器,装饰器在执行被装饰类的功能的前后可以执行相关的扩展功能。

例如,小明要交五块钱班费给班长,但是呢小明的钱还没有取出来,所以还要去银行取出来,但是小明有事。所以,这时小明让班长帮自己取出来给小明,小明再用五块钱交班费。所以在班费之前,让班长替他取了钱。

实现

被装饰类

package cn.sh.designepattern;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/24 15:14
 * @Contact 643947568@qq.com
 */
public interface Weapon {

    public void createWeapon();
}

被装饰类的具体实现

package cn.sh.designepattern;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/24 15:15
 * @Contact 643947568@qq.com
 */
public class Pistol implements Weapon{
    @Override
    public void createWeapon() {
        System.out.println("制造手枪");
    }
}

装饰类

package cn.sh.designepattern;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/24 15:15
 * @Contact 643947568@qq.com
 */
public abstract class WeaponDecorator implements Weapon {

    private Weapon weapon = null;

    public WeaponDecorator(Weapon weapon) {
        this.weapon = weapon;
    }

    @Override
    public void createWeapon() {
        this.weapon.createWeapon();
    }
}

装饰类具体实现

package cn.sh.designepattern;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/24 15:17
 * @Contact 643947568@qq.com
 */
public class ActualWeaponDecorator extends WeaponDecorator {

    public ActualWeaponDecorator(Weapon weapon) {
        super(weapon);
    }

    private void expandMethod() {
        System.out.println("执行扩展方法");
    }

    @Override
    public void createWeapon() {
        super.createWeapon();

        expandMethod();
    }
}

测试

package cn.sh.designepattern;

/** 装饰模式
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/24 14:50
 * @Contact 643947568@qq.com
 */

public class Main {
    public static void main(String[] args) {
        Weapon pistol = new Pistol();
        ActualWeaponDecorator actualWeaponDecorator = new ActualWeaponDecorator(pistol);
        actualWeaponDecorator.createWeapon();
    }
}

适用场景

装饰模式适用于不修改原来类的前提下,扩展类的功能,从而避免了继承关系的实现扩展。

但是装饰过多会导致结构复杂。