Java23种设计模式之观察者模式

一,场景

在一些游戏中经常有这样的一个场景。英雄和怪兽的故事,角色有英雄,陷阱,怪兽,宝物。英雄可以移动,当移动到怪兽或者陷阱范围内就会掉血,移动到宝物范围内就会加血。这个场景怎么实现呢?可能有人说我在陷阱,怪兽,宝物类上加一个死循环,实时监测是否有英雄进入范围,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();
    }
}

主角向前移动
宝物 为主角加血!
陷阱 困住主角!
怪物 对主角攻击!

你可能感兴趣的:(java,design,mode)