/**
*
* 转载请标明出处:http://blog.csdn.net/u013598111/article/details/50196897
* @author:【JunTao_sun】
*
*
*/
在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,
也就是装饰来包裹真实的对象。
至少需要两个类 和一个接口。
一个是被装饰的类 另一个是装饰类,两个类都实现同样的接口。
下面代码 以游戏里的装备 属性加成 做演示。
<span style="font-size:18px;"><span style="font-family:arial;color:#333333;"><span style="line-height: 20px;">/**
* 武器的接口
* @author WJT
*
*/
public interface WeaponI {
// 防御
int defend();
// 攻击
int attack();
}</span></span></span>
下边是实现武器的两个类
/**
* 黑色切割者 实现了武器接口(被装饰的类)
*/
class HeiQue implements WeaponI {
@Override
public int defend() {
// TODO Auto-generated method stub
return 50;
}
@Override
public int attack() {
// TODO Auto-generated method stub
return 45;
}
/**
*饮血剑 实现了武器接口(被装饰的类)
*
*/
class YinXueJian implements WeaponI {
@Override
public int defend() {
// TODO Auto-generated method stub
return 20;
}
@Override
public int attack() {
// TODO Auto-generated method stub
return 35;
}
}
重点来了 装饰者接口,DecorateWeaponI继承武器接口,
也可以直接用装饰者类实现武器接口。
//装饰者接口
public interface DecorateWeaponI extends WeaponI{
}
/**
*
*女妖面纱 装饰类 继承接口
*/
class NvYaoDecorator implements DecorateWeaponI {
private WeaponI w;
//初始化实现武器接口的类 被装饰作用
public NvYaoDecorator(WeaponI w) {
this.w = w;
}
@Override
public int defend() {
return 10+w.defend();
}
@Override
public int attack() {
return 10 + w.attack();
}
}
/**
*兰顿之兆 装饰类
*
*/
public class LanDunDecorator implements DecorateWeaponI {
private WeaponI w;
//获得被装饰的武器
public LanDunDecorator(WeaponI w) {
this.w = w;
}
@Override
public int defend() {
// TODO Auto-generated method stub
return 15 + w.defend();
}
@Override
public int attack() {
// TODO Auto-generated method stub
return 10+w.attack();
}
}
完成(常见IO流--- 装饰者模式应用),测试代码:
public static void main(String[] args) {
// 兰顿之兆+女妖面纱+黑色切割者
WeaponI weapon=new LanDunDecorator(new NvYaoDecorator(new HeiQue()));
System.out.print("武器攻击是"+weapon.attack()+"武器防御是"+weapon.defend());
}
武器属性:攻击是65武器防御是75
手持武器 有点单薄 - -
再另加两件防装(真想来只赤兔6666)
属性大大提升 可以越塔了 LOL。