Appearance
装饰着模式
定义
装饰者模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有类的一个包装。
使用场景
- 需要扩展一个类的功能,或给一个类添加附加职责。
- 需要动态地给一个对象添加功能,这些功能可以再动态地撤销。
- 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
优点
- 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰类重写方法并不影响原有类的方法。
- 装饰模式是继承的一个替代模式,装饰类其本质是继承自被装饰类,具体功能还是由被装饰类来完成,装饰类只负责在完成这些功能的同时可以增加一些额外的功能,从而实现功能的扩展。
- 装饰模式可以动态地扩展一个实现类的功能,这些功能也可以再动态地撤销。
缺点
- 多层装饰比较复杂。
代码示例
这里写了一个技能效果类,然后对其进行装饰,使其具有更多的效果。
接口
java
public interface SkillEffect {
String description();
int cost();
}
要包装的类
java
public class GeneralSkillEffect implements SkillEffect{
@Override
public String description() {
return "普通伤害";
}
@Override
public int cost() {
return 0;
}
}
抽象装饰类
java
public abstract class SkillEffectDecorator implements SkillEffect{
protected SkillEffect skillEffect;
protected Random random = new Random();
public SkillEffectDecorator(SkillEffect skillEffect){
this.skillEffect = skillEffect;
}
@Override
public String description() {
return skillEffect.description();
}
@Override
public int cost() {
return skillEffect.cost();
}
}
具体装饰类
腐蚀效果
java
public class CorrodeDecorator extends SkillEffectDecorator{
public CorrodeDecorator(SkillEffect skillEffect) {
super(skillEffect);
}
@Override
public String description() {
return super.description() + ", 附加腐蚀伤害";
}
@Override
public int cost() {
return super.cost() + random.nextInt(10) + 5;
}
}
破甲效果
java
public class DestroyArmorDecorator extends SkillEffectDecorator{
public DestroyArmorDecorator(SkillEffect skillEffect) {
super(skillEffect);
}
@Override
public String description() {
return super.description() + ", 附加一层破甲效果";
}
@Override
public int cost() {
return super.cost() + random.nextInt(10) + 20;
}
}
击飞效果
java
public class FlyDecorator extends SkillEffectDecorator{
public FlyDecorator(SkillEffect skillEffect) {
super(skillEffect);
}
@Override
public String description() {
return super.description() + ", 附加击飞效果";
}
@Override
public int cost() {
return super.cost() + random.nextInt(20) + 10;
}
}
魔法伤害
java
public class MagicDecorator extends SkillEffectDecorator{
public MagicDecorator(SkillEffect skillEffect) {
super(skillEffect);
}
@Override
public String description() {
return super.description() + ", 附加魔法伤害";
}
@Override
public int cost() {
return super.cost() + random.nextInt(100) + 10;
}
}
物理伤害
java
public class PhysicsDecorator extends SkillEffectDecorator{
public PhysicsDecorator(SkillEffect skillEffect) {
super(skillEffect);
}
@Override
public String description() {
return super.description() + ", 附加物理伤害";
}
@Override
public int cost() {
return super.cost() + random.nextInt(100) + 10;
}
}
真实伤害
java
public class RealDecorator extends SkillEffectDecorator{
public RealDecorator(SkillEffect skillEffect) {
super(skillEffect);
}
@Override
public String description() {
return super.description() + ", 附加真实伤害";
}
@Override
public int cost() {
return super.cost() + random.nextInt(30) + 10;
}
}
击退效果
java
public class RepelDecorator extends SkillEffectDecorator{
public RepelDecorator(SkillEffect skillEffect) {
super(skillEffect);
}
@Override
public String description() {
return super.description() + ", 附加击退效果";
}
@Override
public int cost() {
return super.cost() + random.nextInt(20) + 10;
}
}
毒素伤害
java
public class ToxinDecorator extends SkillEffectDecorator{
public ToxinDecorator(SkillEffect skillEffect) {
super(skillEffect);
}
@Override
public String description() {
return super.description() + ", 附加毒素伤害";
}
@Override
public int cost() {
return super.cost() + random.nextInt(50) + 20;
}
}
眩晕效果
java
public class VertigoDecorator extends SkillEffectDecorator{
public VertigoDecorator(SkillEffect skillEffect) {
super(skillEffect);
}
@Override
public String description() {
return super.description() + ", 附加眩晕效果";
}
@Override
public int cost() {
return super.cost() + random.nextInt(30) + 10;
}
}
使用
java
public class Client {
public static void main(String[] args) {
SkillEffect skillEffect = new GeneralSkillEffect();
System.out.printf("技能效果消耗:%d,技能效果:%s\n", skillEffect.cost(), skillEffect.description());
skillEffect = new MagicDecorator(new PhysicsDecorator(
new ToxinDecorator(new VertigoDecorator(new CorrodeDecorator(
new DestroyArmorDecorator(skillEffect))))));
System.out.printf("技能效果消耗:%d,技能效果:%s\n", skillEffect.cost(), skillEffect.description());
}
}
运行效果
txt
技能效果消耗:0,技能效果:普通伤害
技能效果消耗:203,技能效果:普通伤害, 附加一层破甲效果, 附加腐蚀伤害, 附加眩晕效果, 附加毒素伤害, 附加物理伤害, 附加魔法伤害