C++裡面this關鍵字的用法和功能
阿新 • • 發佈:2020-10-04
大家應該都玩過超級馬里奧,裡邊有怪物,馬里奧正面碰撞就會掉血,有土塊,馬里奧用頭頂就會彈出金幣等等。從這個遊戲中,我們就可以抽離出關於觀察者模式的概念,馬里奧是被觀察者,怪物,土塊等等是觀察者,當被觀察者“刺激”到觀察者後,觀察者就會執行對應的行動。
抽象的來說,觀察者模式定義了一種一對多的依賴關係,多個觀察者物件同時監聽某一個主題物件。觀察者能根據主題物件的變化實時的做出自己的變化。
面向物件程式設計的一個核心或者說程式設計方式就是面向抽象,我們如果單純的實現觀察者模式,那麼必然會導致觀察者和主題物件之間的互相依賴,這種高耦合的程式碼是不可取的。
下面先看一下高耦合的程式碼演示:
觀察者:
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=newList<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 inobserver) 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();
以上我們就完成了一個觀察者模式的體現。
這是我的公眾號二維碼,獲取最新文章,請關注此號