1. 程式人生 > 實用技巧 >【查詢語句、約束、多表之間的關係、正規化、資料庫的備份和還原】

【查詢語句、約束、多表之間的關係、正規化、資料庫的備份和還原】

大家應該都玩過超級馬里奧,裡邊有怪物,馬里奧正面碰撞就會掉血,有土塊,馬里奧用頭頂就會彈出金幣等等。從這個遊戲中,我們就可以抽離出關於觀察者模式的概念,馬里奧是被觀察者,怪物,土塊等等是觀察者,當被觀察者“刺激”到觀察者後,觀察者就會執行對應的行動。

抽象的來說,觀察者模式定義了一種一對多的依賴關係,多個觀察者物件同時監聽某一個主題物件。觀察者能根據主題物件的變化實時的做出自己的變化。

面向物件程式設計的一個核心或者說程式設計方式就是面向抽象,我們如果單純的實現觀察者模式,那麼必然會導致觀察者和主題物件之間的互相依賴,這種高耦合的程式碼是不可取的。

下面先看一下高耦合的程式碼演示:

觀察者:

class NPCObserver
{
    private string Name { get; set; }
    public NPCObserver(string name)
    {
        Name = name;
    }
    public void Update()
    {
        Console.WriteLine($"{Name}收到,奧裡給...");
    }
}

被觀察者(主題物件):

class MarioSubject
{
    //觀察者集合
    private  List<NPCObserver> observer=new
List<NPCObserver>(); //增加觀察者 public void Attach(NPCObserver npc) { this.observer.Add(npc); } //減少觀察者 public void Detach(NPCObserver npc) { this.observer.Remove(npc); } //通知觀察者 public void Notify() { //迴圈呼叫觀察者的更新方法 foreach (NPCObserver npcObserver in
observer) npcObserver.Update(); } }

在主方法中呼叫:

MarioSubject mario=new MarioSubject();
mario.Attach(new NPCObserver("怪哥"));
mario.Attach(new NPCObserver("giaogiao"));
mario.Notify();

執行結果為:

以上程式碼,就是一個高耦合的偽觀察者模式,這種形式,高耦合不說,可擴充套件性還很低,因為它只能通知NPCObserver這個物件,如果出現新的類,必然要改動MarioSubject中的程式碼,這一點也違反了開放-封閉原則(對擴充套件開放,對修改封閉),讀者可以先理解一下這個邏輯,接下來我們將其升級一下,降低耦合性,提高可擴充套件性,使其成為正真的觀察者模式:

首先,我們要定義抽象觀察者和主題物件,讓所有的物件都依賴於抽象。

//抽象主題物件和觀察者
interface ISubject
{
    void Attach(IObserver observer);
    void Detach(IObserver observer);
    void Notify();
}
interface IObserver
{
    void Update();
}

然後讓讓觀察者和主題物件繼承對應的介面:

classNPCObserverSuper:IObserver
{
    private string Name { get; set; }

    public NPCObserverSuper(string name)
    {
        Name = name;
    }

    public void Update()
    {
        Console.WriteLine($"{Name}收到,奧裡給...");
    }
}

class MarioSubjectSuper:ISubject
{
    //觀察者集合
    private List<IObserver> observer = new List<IObserver>();
    //增加觀察者
    public void Attach(IObserver npc)
    {
        this.observer.Add(npc);
    }
    //減少觀察者
    public void Detach(IObserver npc)
    {
        this.observer.Remove(npc);
    }
    //通知觀察者
    public void Notify()
    {
        //迴圈呼叫觀察者的更新方法
        foreach (IObserver npcObserver in observer)
        {
            npcObserver.Update();
        }
    }
}

在主方法中呼叫檢視結果:

ISubject mario = new MarioSubjectSuper();
mario.Attach(new NPCObserverSuper("小阿giao"));
mario.Attach(new NPCObserverSuper("新二"));
mario.Notify();

以上我們就完成了一個觀察者模式的體現。

這是我的公眾號二維碼,獲取最新文章,請關注此號