Decorator装饰器模式Java示例学习

来源:互联网 发布:山东齐鲁网络电视台 编辑:程序博客网 时间:2024/04/28 20:10
使用小时候玩的游戏坦克大战来模拟设计模式的应用
出生时坦克子弹不能穿墙,血量只够挨打1次,
吃了随机出现的道具后血量会够挨打多次,子弹威力也变大,等于加了装饰
首先是创建通用的坦克:

?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
public abstract class Tank
{
 
public int hp;
 
public abstract void attack();
 
public int beAttacked(inti)
{
return hp -= i * 100;
};
}


然后是对这个通用坦克的变身器:
?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
public abstract class BianshenTank extends Tank
{
private Tank tank;
 
public BianshenTank(Tank tank)
{
this.tank = tank;
}
 
@Override
public void attack()
{
tank.attack();
}
 
@Override
public int beAttacked(inti)
{
return tank.beAttacked(i);
}
}


创建出生时的默认坦克,未加装饰:
?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
public class BornTank extendsTank
{
public BornTank()
{
this.hp =100;
}
 
@Override
public void attack()
{
System.out.println("bing! beng! ba!");
}
 
@Override
public int beAttacked(inti)
{
return hp -= i * 100;
}
 
}


加了装饰的坦克,无敌还能穿墙:
?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Wudi extendsBianshenTank
{
public Wudi(Tank tank)
{
super(tank);
hp = 300;
}
 
@Override
public void attack()
{
super.attack();
System.out.println("haha, i can chuanqiang");
}
 
@Override
public int beAttacked(inti)
{
System.out.println("haha, i am wudi");
return hp;
}
}


然后下面就可以使用这个无敌坦克:
?
代码片段,双击复制
01
02
03
04
Tank t = newBornTank();
Wudi w = newWudi(t);
w.attack();
System.out.println("my hp is:"+ w.beAttacked(200));
原创粉丝点击