1. 程式人生 > 其它 >設計模式(18):JAVA(18):設計模式(11)觀察者模式 觀察者模式:被觀察者發生變化時,所有被觀察者都會通知

設計模式(18):JAVA(18):設計模式(11)觀察者模式 觀察者模式:被觀察者發生變化時,所有被觀察者都會通知

如題,我們先抽象出被觀察者和觀察者

/**
 *抽象觀察者
 */
abstract class obServer {
    protected String name;
    public obServer(String name) {
        this.name = name;
    }
    protected SubJect subJect;
    //更新介面
    public abstract void updata();
    //不在觀察
    public abstract void dontLook(SubJect subJect);
}
/**
 *抽象被觀察者
 
*/ abstract class SubJect{ //所有觀察者 private List<obServer> obServerList=new ArrayList<>(); //狀態 private int state; public int getState() { return state; } public void setState(int state) { this.state = state; } //新增觀察者 public void attach(obServer obServer){ obServerList.add(obServer); System.out.println(
"新增觀察者:"+obServer.name); } //刪除觀察者 public void deletObServer(obServer obServer){ obServerList.remove(obServer); System.out.println("移除觀察者:"+obServer.name); } //更新觀察者 public void updateObServer(){ for (obServer o:obServerList) { o.updata(); } } }

有一檔電視節目來當實體(被觀察者)

class TVPlay extends SubJect{
    private String theTVSet;
    public String getTheTVSet() {
        return theTVSet;
    }
    public void setTheTVSet(String theTVSet) {
        this.theTVSet = theTVSet;
    }
    public void play(){
        System.out.println("電視劇開播了!今日節目:"+ theTVSet);
        //通知觀察者
        updateObServer();
    }
}

人實體來充當觀察者

class People extends obServer{
    public People(String name) {
        super(name);
    }
    @Override
    public void updata() {
        System.out.println(name+"收到電視劇開播通知");
    }

    @Override
    public void dontLook(SubJect subJect) {
        subJect.deletObServer(this);
    }
}

執行時,被觀察者會檢查所有觀察者,去呼叫play下發通知

 public static void main(String[] args) {
        TVPlay tvPlay = new TVPlay();
        People man = new People("男人");
        People woman = new People("女人");
        tvPlay.attach(man);
        tvPlay.attach(woman);
        tvPlay.setTheTVSet("宮鎖心玉");
        tvPlay.play();

        System.out.println("新的一期開始了!");
        System.out.println("上次不好看,男人取消了觀察");
        man.dontLook(tvPlay);
        tvPlay.setTheTVSet("宮鎖心玉2");
        tvPlay.play();
    }

本文來自部落格園,作者:秋華,轉載請註明原文連結:https://www.cnblogs.com/qiu-hua/p/15227569.html