携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天
一,场景
在一些游戏中经常有这样的一个场景。英雄和怪兽的故事,角色有英雄,陷阱,怪兽,宝物。英雄可以移动,当移动到怪兽或者陷阱范围内就会掉血,移动到宝物范围内就会加血。这个场景怎么实现呢?可能有人说我在陷阱,怪兽,宝物类上加一个死循环,实时监测是否有英雄进入范围,but,一浪费资源(即使硬性不懂也会实时计算),二计算时机不准确,只要是实时监测就会有时间间隔,英雄都超过范围了才触发,甚至没来的及触发。那么应该如实实现呢?这里用到观察者模式。
二,实现(基于jdk)
1,英雄类为被观察者
import java.util.Observable;
public class Hero extends Observable {
void move() {
System.out.println("主角向前移动");
super.setChanged();
notifyObservers("测试");
}
}
2,怪兽类为观察者
import java.util.Observable;
import java.util.Observer;
/**
* 怪物
*/
public class Monster implements Observer {
private boolean inRange() {
//判断主角是否在自己的影响范围内,这里忽略细节,直接返回true
return true;
}
@Override
public void update(Observable o, Object arg) {
if (inRange()) {
System.out.println("怪物 对主角攻击!");
}
}
}
3,陷阱类为观察者
import java.util.Observable;
import java.util.Observer;
/**
* 陷阱
*/
public class Trap implements Observer {
private boolean inRange() {
//判断主角是否在自己的影响范围内,这里忽略细节,直接返回true
return true;
}
@Override
public void update(Observable o, Object arg) {
if (inRange()) {
System.out.println("陷阱 困住主角!");
}
}
}
4,宝物类为观察者
import java.util.Observable;
import java.util.Observer;
/**
* 宝物
*/
public class Treasure implements Observer {
private boolean inRange() {
//判断主角是否在自己的影响范围内,这里忽略细节,直接返回true
return true;
}
@Override
public void update(Observable o, Object arg) {
if (inRange()) {
System.out.println("宝物 为主角加血!");
}
}
}
测试
public class TestMain {
public static void main(String[] args) {
//初始化对象
Hero hero = new Hero();
Monster monster = new Monster();
Trap trap = new Trap();
Treasure treasure = new Treasure();
//注册观察者
hero.addObserver(monster);
hero.addObserver(trap);
hero.addObserver(treasure);
//移动事件
hero.move();
}
}
主角向前移动
宝物 为主角加血!
陷阱 困住主角!
怪物 对主角攻击!