介绍
动态给一个对象添加一些额外的功能,动态的扩展其功能。
理解
装饰模式,可以方便的扩展一些类的功能。其实现方式更像是一种托管方式,用于将被装饰的类的功能托管给装饰器,装饰器在执行被装饰类的功能的前后可以执行相关的扩展功能。
例如,小明要交五块钱班费给班长,但是呢小明的钱还没有取出来,所以还要去银行取出来,但是小明有事。所以,这时小明让班长帮自己取出来给小明,小明再用五块钱交班费。所以在班费之前,让班长替他取了钱。
实现
被装饰类
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();
}
}
适用场景
装饰模式适用于不修改原来类的前提下,扩展类的功能,从而避免了继承关系的实现扩展。
但是装饰过多会导致结构复杂。