1. 装饰器模式
1.1 定义
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
1.2 样例
定义被装饰类接口:
public interface IEquip {
/**
* 计算攻击力
*
* @return
*/
int calculateAttack();
/**
* 计算防御
*
* @return
*/
int calculateDefense();
/**
* 装备的描述
*
* @return
*/
String description();
default void print() {
System.out.println("装备描述:" + description());
System.out.println("攻击力:" + calculateAttack());
System.out.println("防御力:" + calculateDefense());
}
}
定义子类:
public class ArmorEquip implements IEquip {
@Override
public int calculateAttack() {
return 10;
}
@Override
public int calculateDefense() {
return 30;
}
@Override
public String description() {
return "盔甲";
}
}
public class DragonSwordEquip implements IEquip {
@Override
public int calculateAttack() {
return 100;
}
@Override
public int calculateDefense() {
return 10;
}
@Override
public String description() {
return "屠龙宝刀";
}
}
定义装饰器接口:
public interface IEquipDecorator extends IEquip {
}
定义装饰器类:
public class MoonStoneDecorator implements IEquipDecorator {
/**
* 每个装饰品维护一个装备
*/
private IEquip equip;
public MoonStoneDecorator(IEquip equip) {
this.equip = equip;
}
@Override
public int calculateAttack() {
return equip.calculateAttack();
}
@Override
public int calculateDefense() {
return 10 + equip.calculateDefense();
}
@Override
public String description() {
return equip.description() + " + 太阳石";
}
}
public class SunStoneDecorator implements IEquipDecorator {
/**
* 每个装饰品维护一个装备
*/
private IEquip equip;
public SunStoneDecorator(IEquip equip) {
this.equip = equip;
}
@Override
public int calculateAttack() {
return 10 + equip.calculateAttack();
}
@Override
public int calculateDefense() {
return equip.calculateDefense();
}
@Override
public String description() {
return equip.description() + " + 太阳石";
}
}
测试:
public class Test {
public static void main(String[] args) {
IEquip equip = new MoonStoneDecorator(new MoonStoneDecorator(new SunStoneDecorator(new ArmorEquip())));
equip.print();
equip = new SunStoneDecorator(new SunStoneDecorator(new DragonSwordEquip()));
equip.print();
}
}