1. 程式人生 > 實用技巧 >Gojs學習-文字塊(TextBlocks)

Gojs學習-文字塊(TextBlocks)

當物件間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個物件被修改時,則會自動通知依賴它的物件。觀察者模式屬於行為型模式。
使用場景:

  • 一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這些方面封裝在獨立的物件中使它們可以各自獨立地改變和複用。
  • 一個物件的改變將導致其他一個或多個物件也發生改變,而不知道具體有多少物件將發生改變,可以降低物件之間的耦合度。
  • 一個物件必須通知其他物件,而並不知道這些物件是誰。
  • 需要在系統中建立一個觸發鏈,A物件的行為將影響B物件,B物件的行為將影響C物件……,可以使用觀察者模式建立一種鏈式觸發機制。
import javax.crypto.interfaces.PBEKey;
import java.util.ArrayList;
import java.util.List;

/**
 * Description
 * Author cloudr
 * Date 2020/8/14 21:03
 * Version 1.0
 **/
class Publish {
    public int single;
    public List<Reader> readers = new ArrayList<>();

    public void setSingle(int single) {
        this.single = single;
        notifyAllReader();
    }

    public int getSingle() {
        return single;
    }

    public void  addReader(Reader reader){
        readers.add(reader);
    }


    public void notifyAllReader(){
        for (Reader reader : readers) {
            reader.doSomething();
        }
    }
}

class   Reader{
    public Publish publish = new Publish();

    public void doSomething() {

    }

}

class ReadA extends Reader {

    public ReadA(Publish publish){
        this.publish = publish;
        this.publish.addReader(this);
    }


    public void doSomething(){
        System.out.println("I'm A, single =" + publish.getSingle());
    }
}

class ReadB extends Reader{
    public ReadB(Publish publish){
        this.publish = publish;
        this.publish.addReader(this);
    }

    public void doSomething(){
        System.out.println("I'm B, single ="+ publish.getSingle());
    }
}

public class PublishReaderDemo{
    public static void main(String[] args) {
        Publish publish = new Publish();
        Reader readerA = new ReadA(publish);
        Reader readerB = new ReadA(publish);
        publish.setSingle(1);
        publish.setSingle(2);
    }
}

參考

[1]https://www.runoob.com/design-pattern/observer-pattern.html