观察者模式

master
terry 3 years ago
parent 91f4e9d149
commit 3c11abca26

Binary file not shown.

@ -8,13 +8,13 @@ public class DefaultFireStrategy implements FireStrategy {
public void fire(Tank tank) {
int bx = tank.getX() + Tank.WIDTH / 2 - Bullet.WIDTH / 2;
int by = tank.getY() + Tank.HEIGHT / 2 - Bullet.HEIGHT / 2;
// new Bullet(bx, by, tank.getDir(), tank.getGroup());
new Bullet(bx, by, tank.getDir(), tank.getGroup());
// GameModel.getInstance().add(new RectDecorator(new Bullet(bx, by, tank.getDir(), tank.getGroup())));
GameModel.getInstance().add(new RectDecorator(
new TailDecorator(
new Bullet(bx, by, tank.getDir(), tank.getGroup())
)
));
// GameModel.getInstance().add(new RectDecorator(
// new TailDecorator(
// new Bullet(bx, by, tank.getDir(), tank.getGroup())
// )
// ));
if (tank.getGroup() == Group.GOOD) new Thread(() -> new Audio("audio/tank_fire.wav").play()).start();
}
}

@ -5,6 +5,9 @@ import com.demo.tank.enums.Group;
import com.demo.tank.util.ResourceManager;
import java.awt.*;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.Arrays;
import java.util.Random;
public class Tank extends GameObject {
@ -124,6 +127,14 @@ public class Tank extends GameObject {
fireStrategy.fire(this);
}
public void handleFireKey(){
java.util.List<TankFireObserver> observers = Arrays.asList(new TankFireHandler());
TankEvent event = new TankEvent(Timestamp.from(Instant.now()), this);
for (TankFireObserver o : observers){
o.actionOnFire(event);
}
}
public void die() {
this.living = false;
}

@ -0,0 +1,21 @@
package com.demo.tank.course9;
import java.sql.Timestamp;
public class TankEvent {
private Timestamp timestamp;
private Tank source;
public TankEvent(Timestamp timestamp, Tank source) {
this.timestamp = timestamp;
this.source = source;
}
public Timestamp getTimestamp() {
return timestamp;
}
public Tank getSource() {
return source;
}
}

@ -0,0 +1,10 @@
package com.demo.tank.course9;
public class TankFireHandler implements TankFireObserver{
@Override
public void actionOnFire(TankEvent event) {
Tank tank = event.getSource();
System.out.println("my tank fire time: " + event.getTimestamp());
tank.fire();
}
}

@ -0,0 +1,5 @@
package com.demo.tank.course9;
public interface TankFireObserver {
void actionOnFire(TankEvent event);
}

@ -90,7 +90,7 @@ public class TankFrameV9 extends Frame {
bD = false;
break;
case KeyEvent.VK_SPACE:
gm.tank.fire();
gm.tank.handleFireKey();
break;
default:
break;

Loading…
Cancel
Save