前面对策略模式和单例模式都进行了理论化的总结,下面是这两种设计模式在坦克大战中的使用。
在应用这两种设计模式之前,代码在这里:
https://github.com/phs999/DesignPatterns/tree/e6d14348afa089398fac14dddc5f77315b1e4bb2
其中Tank类中fire()方法,控制了坦克发射炮弹的位置和方式。但这样每个Tank对象的fire()方法都是一样的,见下面的Tank类。但具体程序中可能有不同的需求。比如,敌方坦克没有人控制的话,需要自己随机发射炮弹;我方坦克有人控制,需要在按下特定键时发射炮弹,甚至可以增强向四个方向发射炮弹。以上这些需求都可通过策略模式,以面向接口的方式实现。
package phs999.tank;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Random;
public class Tank {
private int x, y;
private Dir dir = Dir.UP;
private boolean moving = false;//默认坦克不自动移动
private static final int speed = 5;
private static int WIDTH=ResourceMgr.goodTankD.getWidth();
private static int HEIGHT=ResourceMgr.goodTankD.getHeight();
private TankFrame tf=null;
private boolean live=true;
private Group group=Group.BAD;
private Random random=new Random();
Rectangle rect=new Rectangle();
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public static int getWIDTH() {
return WIDTH;
}
public static int getHEIGHT() {
return HEIGHT;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
public boolean isMoving() {
return moving;
}
public void setMoving(boolean moving) {
this.moving = moving;
}
public Dir getDir() {
return dir;
}
public void setDir(Dir dir) {
this.dir = dir;
}
public Tank(int x, int y, Dir dir,Group group,TankFrame tf) {
super();
this.x = x;
this.y = y;
this.dir = dir;
this.group=group;
this.tf=tf;
if (group.equals(Group.BAD)) {
moving=true;
}
rect.x=x;
rect.y=y;
rect.width=WIDTH;
rect.height=HEIGHT;
}
public void paint(Graphics g)