观察者模式

UML图:


下面代码,设计一个主角,当主角移动时,怪物攻击主角,陷阱困住主角,宝箱给主角加血


基本对象类

//观察者

public interface Observer {
    public void update();
}

//被观察者

abstract public class Subject {
//观察者列表
private List<Observer> observerList = new ArrayList<Observer>();
//添加观察者
    public void attachObserver(Observer observer) {
        observerList.add(observer);
    }
    //删除观察者
    public void detachObserver(Observer observer){
        observerList.remove(observer);
    }
    //通知观察者
    public void notifyObservers(){
        for (Observer observer: observerList){
            observer.update();
        }
    }
}


实体类

//怪物
public class Monster implements Observer{
    @Override
    public void update() {
        System.out.println("怪物 对主角攻击!");
    }
}
//陷阱
public class Trap implements Observer{
    @Override
    public void update() {
         System.out.println("陷阱 困住主角!");
    }
}
//宝箱
public class Treasure implements Observer{
    @Override
    public void update() {
        System.out.println("宝物 为主角加血!");
    }
}


//主角
public class Hero extends Subject{
    void move(){
        System.out.println("主角移动移动");
        notifyObservers();
    }
}


main方法

public class MainTest {
    public static void main(String[] args) {
            //初始化对象
        Hero hero = new Hero();
        Monster monster = new Monster();
        Trap trap = new Trap();
        Treasure treasure = new Treasure();
        //注册观察者
        hero.attachObserver(monster);
        hero.attachObserver(trap);
        hero.attachObserver(treasure);
        //移动事件
        hero.move();
    }
}

结果如下

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


{context}