我: 是的,I am here
PM:我又想弄一個轉蛋活動,就是轉一次可以獲得隨機屬性裝備(頭盔、上衣、下衣、手套、鞋子)等等...
PM:但是我有兩種金額的轉蛋,50元可以轉出上衣、下衣,但是100元可以轉出整套的裝備
我:好的,沒問題喔
於是我將code先寫成這樣
using System; namespace DesignPattern.FacadePattern { class Run { static void Main(string[] args) { Console.WriteLine("50元轉蛋:"); Gashapon gash = new Gashapon(); gash.getCoat(); gash.getPants(); Console.WriteLine("100元轉蛋:"); gash.getHat(); gash.getCoat(); gash.getPants(); gash.getGloves(); gash.getShoe(); Console.Read(); } class Gashapon { //獲得頭盔 public void getHat() { Console.WriteLine("獲得隨機屬性頭盔"); } //獲得上衣 public void getCoat() { Console.WriteLine("獲得隨機屬性上衣"); } //獲得褲子 public void getPants() { Console.WriteLine("獲得隨機屬性褲子"); } //獲得手套 public void getGloves() { Console.WriteLine("獲得隨機屬性手套"); } //獲得鞋子 public void getShoe() { Console.WriteLine("獲得隨機屬性鞋子"); } } } }先建立一個Gashapon轉蛋的類別,裡面有getHat()、getCoat()、getPants()、getGloves()、getShoe()分別是獲得各種裝備的方法
這樣寫也沒什麼不對,只是如果PM又要加碼武器(刀、劍、槍....)等等
這樣不就又多了好多個方法,這樣程式變的很雜亂
所以可以透過外觀模式來整理一下介面
using System; namespace DesignPattern.FacadePattern { class Run { static void Main(string[] args) { Console.WriteLine("50元轉蛋:"); GashaponFacade gash = new GashaponFacade(); gash.get50Item(); Console.WriteLine("100元轉蛋:"); gash.get100Item(); Console.Read(); } class GashaponFacade { Gashapon gash; public GashaponFacade() { gash = new Gashapon(); } public void get50Item() { gash.getCoat(); gash.getPants(); } public void get100Item() { gash.getHat(); gash.getCoat(); gash.getPants(); gash.getGloves(); gash.getShoe(); } } class Gashapon { //獲得頭盔 public void getHat() { Console.WriteLine("獲得隨機屬性頭盔"); } //獲得上衣 public void getCoat() { Console.WriteLine("獲得隨機屬性上衣"); } //獲得褲子 public void getPants() { Console.WriteLine("獲得隨機屬性褲子"); } //獲得手套 public void getGloves() { Console.WriteLine("獲得隨機屬性手套"); } //獲得鞋子 public void getShoe() { Console.WriteLine("獲得隨機屬性鞋子"); } } } }這邊新增了一個GashaponFacade類別,來整理出購買50元或100元會得到的虛寶
可以看到我們在使用get50Item()可以不需要去接觸那些繁瑣的事,只要透過get50Item()為我們處理50元的虛寶即可,外觀模式的威力就在於此。
另外,在重構時我們可能會接觸到充滿耦合、邏輯錯綜複雜的程式,其實我們也可以先為這塊加入外觀模式,將不同階層的程式透過中間層隔離,接著在為各區塊進行重構,我們可以就中間層進行測試,就可以避免造成測試不易的問題。
沒有留言:
張貼留言