标签:design src 图片 定义 image gen 种类 tac ext
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
(图片来自headfirst 设计模式)
在网游中通常有各式各样的武器,还可以通过附魔给武器添加各种攻击特效,现在我们通过装饰者模式来实现一下这个效果。
/**
* 武器剑类,武器接口的实现类。对应上图的ConcreteComponnet类
* @author ZJ
*/
public class Sword implements Weapon{
@Override
public void attack() {
System.out.println("用剑刺");
}
}
/**
* 武器剑类,武器接口的实现类。对应上图的ConcreteComponnet类
* @author ZJ
*/
public class Sword implements Weapon{
@Override
public void attack() {
System.out.println("用剑刺");
}
}
/**
* 附魔抽象类,对应上图的Decorator类。
* 实现Weapon接口,是因为武器附魔后还可以当成武器来使用。
* @author ZJ
*
*/
public abstract class Enchantment implements Weapon {
protected Weapon weapon;
//通过构造方法传入需要装饰的对象
public Enchantment(Weapon weapon) {
this.weapon = weapon;
}
//抽象攻击方法,每一个具体的附魔装饰者类都应该有它的实现。
public abstract void attack();
}
/**
* 火属性附魔类。对应途中ConcreteDecorator类
* 这是一个具体的装饰者实现类
* @author ZJ
*
*/
public class EnchantingWithFire extends Enchantment{
public EnchantingWithFire(Weapon weapon) {
super(weapon);
}
//实现具体的攻击方法
public void attack() {
// TODO Auto-generated method stub
System.out.print("火属性攻击特效--------");
weapon.attack();
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Weapon sword = new Sword();
Weapon fireSword = new EnchantingWithFire(sword);
sword.attack();
fireSword.attack();
}
}
输出结果:
用剑刺
火属性攻击特效--------用剑刺
看完这么上面的例子你可能觉得干嘛这么麻烦,写一堆接口和类,我直接写一个火属性攻击特效的剑类和一个普通的剑类就好啦。的确在我们上面的例子中或许直接写两个类是更好的方式但是在网游中,武器可不止剑一种,说不定有什么倚天剑、屠龙刀、打狗棒、杀猪刀等等。附魔的属性也可能有光、冰、火等等这样的话直接写类的方式就要写光属性倚天剑、冰属性倚天剑、火属性倚天剑相当于武器种类数 * 附魔种类数的类的一大堆类而我们例子的实现方式就只需要武器种类数+附魔种类数的类。而且每添加一种武器我们也只需要添加一个普通武器类就好了,不需要考虑各种附魔的类。
对于装饰者模式,更多的可以参考java io的类库。
github:https://github.com/Panici4/DesignPattern/tree/master/decorator
标签:design src 图片 定义 image gen 种类 tac ext
原文地址:https://www.cnblogs.com/panici12/p/9452308.html