題目1:幾個同事為了在上班期間偷偷看休息,做點其他的事情,就和小秘偷偷聯繫了一下,如果老闆回來了,就麻煩小秘偷偷通知一聲,這樣方便大家及時變更自己的工作狀態。 分析: 根據題目分析,首先明確,肯定會有兩個類:小秘類和同事類,分別描述與記錄兩種類型的人和行為。 需要註意的是:小秘與同事構建聯繫的時候, ...
題目1:幾個同事為了在上班期間偷偷看休息,做點其他的事情,就和小秘偷偷聯繫了一下,如果老闆回來了,就麻煩小秘偷偷通知一聲,這樣方便大家及時變更自己的工作狀態。
分析:
根據題目分析,首先明確,肯定會有兩個類:小秘類和同事類,分別描述與記錄兩種類型的人和行為。
需要註意的是:小秘與同事構建聯繫的時候,一個小秘可能對應多位同事,所以這時需要利用List<>。
實現:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Secretary lady = new Secretary(); 6 StockObserver num1 = new StockObserver("A", lady); 7 StockObserver num2 = new StockObserver("B", lady); 8 9 lady.Attach(num1); 10 lady.Attach(num2); 11 12 lady.SecretAction="boss is back"; 13 lady.Notify(); 14 15 Console.Read(); 16 } 17 } 18 19 /// <summary> 20 /// 小秘 21 /// 1.記下需要聯繫的同事們List<StockObserver> 22 /// 2.增加需要聯繫的人員 23 /// 3.減少聯繫人員(有可能沒有通知到,有可能人員辭職等) 24 /// 4.秘密通知同事,老闆回來了 25 /// </summary> 26 class Secretary 27 { 28 IList<StockObserver> stockOb = new List<StockObserver>(); 29 private string action; 30 31 public string SecretAction 32 { 33 get 34 { 35 return action; 36 } 37 38 set 39 { 40 action = value; 41 } 42 } 43 44 //增加需要聯繫的人員 45 public void Attach(StockObserver ob) 46 { 47 stockOb.Add(ob); 48 } 49 50 //減少需要聯繫的人員 51 public void Detach(StockObserver ob) 52 { 53 stockOb.Remove(ob); 54 } 55 56 //小秘通知了同事後,同事趕緊自行更改工作狀態 57 public void Notify() 58 { 59 foreach (StockObserver o in stockOb) 60 o.Update(); 61 } 62 } 63 64 /// <summary> 65 /// 看股票的同事 66 /// 1.聯繫小秘,和小秘保持良好關係 67 /// 2.根據小秘的偷偷通知修改自己的工作狀態 68 /// </summary> 69 class StockObserver 70 { 71 private string name; 72 private Secretary sec; 73 74 public StockObserver(string name,Secretary sec) 75 { 76 this.name = name; 77 this.sec = sec; 78 } 79 public void Update() 80 { 81 Console.WriteLine("{0} {1} 關閉股票行情,繼續工作!", sec.SecretAction, name); 82 } 83 }View Code
題目2:由於同事們人數眾多,所以大家休閑的方式並不一致。
分析:
同事們的休閑方式不同,他們彼此之間存在共同點與不同點。
他們的共同點在於都需要與小秘聯繫且更新工作狀態,同時他們的不同點也在於更新工作狀態。
所以相同點就不需要在子類中贅述,所以通過抽象類來將不同的方法設為抽象即可。
實現:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Secretary lady = new Secretary(); 6 StockObserver num1 = new StockObserver("A", lady); 7 NBAObserver num2 = new NBAObserver("B", lady); 8 9 lady.Attach(num1); 10 lady.Attach(num2); 11 12 lady.SecretAction = "boss is back"; 13 lady.Notify(); 14 15 Console.Read(); 16 } 17 } 18 19 /// <summary> 20 /// 小秘 21 /// 1.記下需要聯繫的同事們List<StockObserver> 22 /// 2.增加需要聯繫的人員 23 /// 3.減少聯繫人員(有可能沒有通知到,有可能人員辭職等) 24 /// 4.秘密通知同事,老闆回來了 25 /// </summary> 26 class Secretary 27 { 28 IList<Observers> observers = new List<Observers>(); 29 private string action; 30 31 public string SecretAction 32 { 33 get 34 { 35 return action; 36 } 37 38 set 39 { 40 action = value; 41 } 42 } 43 44 //增加需要聯繫的人員 45 public void Attach(Observers ob) 46 { 47 observers.Add(ob); 48 } 49 50 //減少需要聯繫的人員 51 public void Detach(Observers ob) 52 { 53 observers.Remove(ob); 54 } 55 56 //小秘通知了同事後,同事趕緊自行更改工作狀態 57 public void Notify() 58 { 59 foreach (Observers o in observers) 60 o.Update(); 61 } 62 } 63 64 /// <summary> 65 /// 觀察者類 66 /// 抽象類 67 /// 偷偷玩的同事的狀態都不同,他們的共同點就是1.與小秘聯繫,2.更新工作狀態 68 /// 不同點在於更新狀態前不同,所以更新工作狀態設置為抽象方法即可 69 /// </summary> 70 abstract class Observers 71 { 72 protected string name; 73 protected Secretary sec; 74 75 public Observers(string name,Secretary sec) 76 { 77 this.name = name; 78 this.sec = sec; 79 } 80 81 public abstract void Update(); 82 } 83 84 85 /// <summary> 86 /// 看股票的同事 87 /// 繼承於觀察者類 88 /// 根據小秘的偷偷通知修改自己的工作狀態 89 /// </summary> 90 class StockObserver:Observers 91 { 92 public StockObserver(string name, Secretary sec) 93 : base(name, sec) 94 { 95 } 96 97 public override void Update() 98 { 99 Console.WriteLine("{0} {1} 關閉股票行情,繼續工作!", sec.SecretAction,name); 100 } 101 } 102 103 /// <summary> 104 /// 看NBA節目的同事 105 /// 繼承於觀察者類 106 /// 根據小秘的偷偷通知修改自己的工作狀態 107 /// </summary> 108 class NBAObserver : Observers 109 { 110 public NBAObserver(string name, Secretary sec) 111 : base(name, sec) 112 { 113 } 114 115 public override void Update() 116 { 117 Console.WriteLine("{0} {1} 關閉NBA直播,繼續工作!", sec.SecretAction, name); 118 } 119 }View Code
題目3:如果小秘突然有事情變得特別忙的時候,就沒有了通知者,而此刻老闆突然回來了,所以老闆本身就變成了臨時的通知者。
分析:
老闆本身變成了臨時的通知者,雖然這個故事很不幸,但是客觀分析,此刻老闆的作用於小秘是一樣的,所以老闆應該和小秘繼承於同一種父類。
由於老闆需要與觀察者聯繫,而此刻的觀察者已是抽象類,所以老闆的父類不能再為抽象類了。
原因如下:
故此,老闆和小秘只能通過介面來實現了。
實現:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Boss boss = new Boss(); 6 7 8 Secretary lady = new Secretary(); 9 StockObserver num1 = new StockObserver("A", lady); 10 NBAObserver num2 = new NBAObserver("B", lady); 11 12 //lady沒來的及通知兩位同事 13 lady.Detach(num1); 14 lady.Detach(num2); 15 16 //現在的通知者就變成了boss 17 boss.Attach(num1); 18 boss.Attach(num2); 19 20 //num2沒有看見boss回來,所以boss沒來的及通知他 21 boss.Detach(num2); 22 23 boss.SecretAction = "boss is back"; 24 boss.Notify(); 25 26 Console.Read(); 27 } 28 } 29 30 /// <summary> 31 /// 通知者的介面 32 /// 不能用抽象類 33 /// </summary> 34 interface Subject 35 { 36 void Attach(Observers ob); 37 void Detach(Observers ob); 38 void Notify(); 39 string SecretAction 40 { 41 get;set; 42 } 43 } 44 45 class Boss : Subject 46 { 47 IList<Observers> observers = new List<Observers>(); 48 private string action; 49 50 public string SecretAction 51 { 52 get 53 { 54 return action; 55 } 56 57 set 58 { 59 action = value; 60 } 61 } 62 63 //增加需要聯繫的人員 64 public void Attach(Observers ob) 65 { 66 observers.Add(ob); 67 } 68 69 //減少需要聯繫的人員 70 public void Detach(Observers ob) 71 { 72 observers.Remove(ob); 73 } 74 75 //大家看見boss回來後,同事趕緊自行更改工作狀態 76 public void Notify() 77 { 78 foreach (Observers o in observers) 79 o.Update(); 80 } 81 } 82 83 /// <summary> 84 /// 小秘:繼承於介面 85 /// 1.記下需要聯繫的同事們List<StockObserver> 86 /// 2.增加需要聯繫的人員 87 /// 3.減少聯繫人員(有可能沒有通知到,有可能人員辭職等) 88 /// 4.秘密通知同事,老闆回來了 89 /// </summary> 90 class Secretary:Subject 91 { 92 IList<Observers> observers = new List<Observers>(); 93 private string action; 94 95 public string SecretAction 96 { 97 get 98 { 99 return action; 100 } 101 102 set 103 { 104 action = value; 105 } 106 } 107 108 //增加需要聯繫的人員 109 public void Attach(Observers ob) 110 { 111 observers.Add(ob); 112 } 113 114 //減少需要聯繫的人員 115 public void Detach(Observers ob) 116 { 117 observers.Remove(ob); 118 } 119 120 //小秘通知了同事後,同事趕緊自行更改工作狀態 121 public void Notify() 122 { 123 foreach (Observers o in observers) 124 o.Update(); 125 } 126 } 127 128 /// <summary> 129 /// 觀察者類 130 /// 抽象類 131 /// 偷偷玩的同事的狀態都不同,他們的共同點就是1.與小秘聯繫,2.更新工作狀態 132 /// 不同點在於更新狀態前不同,所以更新工作狀態設置為抽象方法即可 133 /// </summary> 134 abstract class Observers 135 { 136 protected string name; 137 protected Secretary sec; 138 139 public Observers(string name, Secretary sec) 140 { 141 this.name = name; 142 this.sec = sec; 143 } 144 145 public abstract void Update(); 146 } 147 148 149 /// <summary> 150 /// 看股票的同事 151 /// 繼承於觀察者類 152 /// 根據小秘的偷偷通知修改自己的工作狀態 153 /// </summary> 154 class StockObserver : Observers 155 { 156 public StockObserver(string name, Secretary sec) 157 : base(name, sec) 158 { 159 } 160 161 public override void Update() 162 { 163 Console.WriteLine("{0} {1} 關閉股票行情,繼續工作!", sec.SecretAction, name); 164 } 165 } 166 167 /// <summary> 168 /// 看NBA節目的同事 169 /// 繼承於觀察者類 170 /// 根據小秘的偷偷通知修改自己的工作狀態 171 /// </summary> 172 class NBAObserver : Observers 173 { 174 public NBAObserver(string name, Secretary sec) 175 : base(name, sec) 176 { 177 } 178 179 public override void Update() 180 { 181 Console.WriteLine("{0} {1} 關閉NBA直播,繼續工作!", sec.SecretAction, name); 182 } 183 }View Code
附:
實現:
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Boss boss = new Boss(); 6 Secretary lady = new Secretary(); 7 8 StockObserver num1 = new StockObserver("A", boss); 9 NBAObserver num2 = new NBAObserver("B", boss); 10 11 //將“看股票”的“關閉股票程式”方法和“看NBA者”的“關閉NBA直播”的方法 12 //掛鉤到老闆的“更新”上,也就是將兩種不同類的不同方法委托給老闆類的更新了。 13 boss.Update += new EventHandler(num1.CloseStockMarket); 14 boss.Update += new EventHandler(num2.CloseNBADirectSeeding); 15 16 boss.SecretAction = "boss is back"; 17 boss.Notify(); 18 19 Console.Read(); 20 } 21 } 22 23 /// <summary> 24 /// 通知者的介面 25 /// 不能用抽象類 26 /// 現在抽象通知者由於不下網依賴抽象觀察者,所以“增加”和“減少”的方法就沒有必要了 27 /// </summary> 28 interface Subject 29 { 30 void Notify(); 31 string SecretAction 32 { 33 get; set; 34 } 35 } 36 37 /// <summary> 38 /// 委托就是一種引用方法的類型。 39 /// 一旦為委托分配了方法,委托將於該方法具有完全相同的行為 40 /// 委托方法的使用可以像任何其他方法一樣,具有參數和返回值。 41 /// 委托可以看做是對函數的抽象,是函數的‘類’,委托的實例將代表一個具體的函數 42 /// 43 /// 一個委托可以搭載多個方法,所有的方法被依次喚起 44 /// 最重要的是,它可以使得委托對象所搭載的方法並不需要屬於同一個類 45 /// 46 /// 委托對象所搭載的所有方法必須具有相同的原型和形式,也就是有相同的參數列表和返回值類型 47 /// </summary> 48 delegate void EventHandler(); //委托 49 50 class Boss : Subject 51 { 52 public event EventHandler Update; 53 54 private string action; 55 56 public string SecretAction 57 { 58 get 59 { 60 return action; 61 } 62 63 set 64 { 65 action = value; 66 } 67 } 68 69 //大家看見boss回來後,同事趕緊自行更改工作狀態 70 public void Notify() 71 { 72 Update(); 73 } 74 } 75 76 /// <summary> 77 /// 小秘:繼承於介面 78 /// 1.記下需要聯繫的同事們List<StockObserver> 79 /// 2.增加需要聯繫的人員 80 /// 3.減少聯繫人員(有可能沒有通知到,有可能人員辭職等) 81 /// 4.秘密通知同事,老闆回來了 82 /// </summary> 83 class Secretary : Subject 84 { 85 public event EventHandler Update; 86 87 private string action; 88 89 public string SecretAction 90 { 91 get 92 { 93 return action; 94 } 95 96 set 97 { 98 action = value; 99 } 100 } 101 102 103 //小秘通知了同事後,同事趕緊自行更改工作狀態 104 public void Notify() 105 { 106 Update(); 107 } 108 } 109 110 /// <summary> 111 /// 看股票的同事 112