观察者模式

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) { public void fire(Tank tank) {
int bx = tank.getX() + Tank.WIDTH / 2 - Bullet.WIDTH / 2; int bx = tank.getX() + Tank.WIDTH / 2 - Bullet.WIDTH / 2;
int by = tank.getY() + Tank.HEIGHT / 2 - Bullet.HEIGHT / 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 Bullet(bx, by, tank.getDir(), tank.getGroup())));
GameModel.getInstance().add(new RectDecorator( // GameModel.getInstance().add(new RectDecorator(
new TailDecorator( // new TailDecorator(
new Bullet(bx, by, tank.getDir(), tank.getGroup()) // new Bullet(bx, by, tank.getDir(), tank.getGroup())
) // )
)); // ));
if (tank.getGroup() == Group.GOOD) new Thread(() -> new Audio("audio/tank_fire.wav").play()).start(); 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 com.demo.tank.util.ResourceManager;
import java.awt.*; import java.awt.*;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.Arrays;
import java.util.Random; import java.util.Random;
public class Tank extends GameObject { public class Tank extends GameObject {
@ -124,6 +127,14 @@ public class Tank extends GameObject {
fireStrategy.fire(this); 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() { public void die() {
this.living = false; 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; bD = false;
break; break;
case KeyEvent.VK_SPACE: case KeyEvent.VK_SPACE:
gm.tank.fire(); gm.tank.handleFireKey();
break; break;
default: default:
break; break;

Loading…
Cancel
Save