观察者模式案例

题目:

请用观察者模式实现如下实例:

观察者有游戏观察者(GameObserver)和视频观察者(VideoObserver)。

观察者中的更新函数(updata)只需输出具体Subject对象的状态和状态改变语句即可。

目标对象(Subject)有哨兵(Sentry)和老师(teacher),一个目标对象可以对应多个和多种观察者对象,

当客服端目标对象状态设置为("高老师来了"),调用通知函数(notifyObserver)通知所有对应的观察者对象执行更新函数。

其中老师(teacher)的状态还包括一个惩罚(panish)函数,惩罚(panish)函数输出如下“XXX  XXX(所有惩罚人的名字)把观察者模式的结构图抄写10遍”

完成状态更新。


类图:

观察者模式案例_第1张图片

代码:

package Observer;

import java.util.ArrayList;
//抽象观察者角色
abstract class Observer
{
    protected String name;
    protected Subject sub;
    Observer(String name, Subject sub)
    {
        this.name = name;
        this.sub = sub;
    }
    public String getName(){ return this.name; }
    public abstract void updata();
};
//抽象主题角色(被观察者)
abstract class Subject
{
    protected ArrayList gObservers = new ArrayList ();

    public void attach(Observer gOb){ gObservers.add(gOb); }
    public void Detach(Observer gOb){ gObservers.remove(gOb); }
    public void notifyObserver()
    {
        for (Observer part:gObservers)
        {
            part.updata();
        }
    }
    public abstract void setState(String action);
    public abstract String getState();
};
//具体主题角色(具体被观察者)
class Teacher extends  Subject
{
    private String teacherAction;
    public String punish()
    {
        String s = new String();
        for (Observer part:gObservers)
        {
            s = s + part.getName() + " ";
        }
        s = s + "把观察者模式的结构图抄写10遍";
        return s;
    }
    public void setState(String action){ this.teacherAction = action + this.punish(); }
    public String getState(){ return this.teacherAction; }

};
//具体观察者(游戏观察者)
class GameObserver extends Observer
{

    GameObserver(String name, Subject sub){ super(name,sub);}
    public void updata()
    {
        System.out.println(this.sub.getState() + " " + this.name + " 关闭游戏,开始做实验");
    }
};
//具体观察者(视频观察者)
class VideoObserver extends Observer
{
    VideoObserver(String name, Subject sub){ super(name,sub);}
    public void updata()
    {
        System.out.println(this.sub.getState() + " " + this.name + " 关闭视频,开始做视频");
    }
};

public class ClassObserver {
    public static void main(String[] args){
        Subject haoren = new Teacher();
        Observer xiaoming = new GameObserver("小明", haoren);
        Observer xiaobai = new VideoObserver("小白", haoren);

        haoren.attach(xiaoming);
        haoren.attach(xiaobai);

        haoren.setState("李老师过来了");
        haoren.notifyObserver();    
    }
}


结果:


你可能感兴趣的:(设计模式)