周所周知,超市收銀系統都具有計費功能,那麼要你做乙個可以依據輸入的商品單位**和數量,以及計費方式進行計算的模組,你怎樣做?計費方式也就是打不打折,有沒有返利優惠等等。那麼我們先用簡單工廠模式去實現一下。
簡單工廠實現
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
namespace 商場收銀軟體
double total = 0.0d;
private void textbox1_textchanged(object sender, eventargs e)
private void label5_click(object sender, eventargs e)
private void form1_load(object sender, eventargs e)
);cbxtype .selectedindex =0;
}private void buttonok_click(object sender, eventargs e)
private void button2_click(object sender, eventargs e)
}//現金收費抽象類
abstract class cashsuper
//正常收費子類
class cashnormal : cashsuper
}//打折收費子類
class cashrebate : cashsuper
public override double acceptcash(double money)
}//返利收費子類
class cashreturn : cashsuper
public override double acceptcash(double money)
}//現金收費工廠類
class cashfactory
return cs;}}
}
我們看到,這樣的方案的特點就是將計費方式的例項化放到了工廠裡。從而在須要加入新的計費方式的時候,僅僅需在工廠裡加一下條件。完了再設計乙個對應的類就可以。
可是這樣做相同也破壞了開放—封閉原則,每一次的擴充套件都要大動干戈,實在是不好,不好。面對演算法的時常變動。怎樣應對?以下我們用還有一種方式試試:
策略模式實現
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
namespace 商場收銀軟體
double total = 0.0d;
private void textbox1_textchanged(object sender, eventargs e)
private void label5_click(object sender, eventargs e)
private void form1_load(object sender, eventargs e)
);cbxtype .selectedindex =0;
}private void buttonok_click(object sender, eventargs e)
double totalprices = 0d;
totalprices = cc.getresult(convert.todouble(txtprice.text) * convert.todouble(txtnum.text));
total = total + totalprices;
lbxlist.items.add("單位**:" + txtprice.text + "數量:" + txtnum.text + "計費方式:" + cbxtype.selecteditem + "合計:" + totalprices.tostring());
lblresult.text = total.tostring();
}private void button2_click(object sender, eventargs e)
}//現金收費抽象類
abstract class cashsuper
//正常收費子類
class cashnormal : cashsuper
}//打折收費子類
class cashrebate : cashsuper
public override double acceptcash(double money)
}//返利收費子類
class cashreturn : cashsuper
public override double acceptcash(double money)
}//現金收費工廠類
//class cashfactory
//// return cs;
// }
//}//cashcontext類
class cashcontext
public double getresult(double money)
}}
對照兩個方案,我們能夠看到不同之處就是策略模式將工廠類撤了。取而代之的是cashcontext類,然而又將實現哪乙個演算法的推斷交給了client,這樣client承擔的責任又大了,不好。不好……
怎麼辦?要不將簡單工廠和策略模式混搭?試試看。對於他們的結合。僅僅需將cashcontext類改造一下就可以,例如以下:
//改造後的cashcontext類
class cashcontext
}public double getresult(double money)
}
這樣一來,client的**就要簡單的多了,簡單工廠模式須要讓client和兩個類cashsuper和cashfactory打交道,而策略模式與簡單工廠結合後的使用方法,client就僅僅需和cashcontext打交道就可完畢對應的功能,減少了耦合性。
我們再回過頭去看策略模式的定義:
策略模式:定義了演算法家族,分別封裝起來,讓它們之間能夠相互替代,此模式讓演算法的變化,不會影響到使用此演算法的客戶。
團購模式弊端漸現
谷歌日前 60億美元收購groupon,這個搜尋巨頭的目的何在?商戶喜歡groupon的什麼地方呢?groupon是目前網際網路領域最火熱的公司之一,這家 每天都會提供給使用者來自本地商戶的最低折扣商品。它的運作方式在於,groupon聯絡本地商戶,然後承諾如果商戶提供低折扣的商品或服務的話,將為這...
團購模式因何衰敗
如果問大家,在過去的一年中,網際網路上最火爆的詞彙是什麼?恐怕除了微博,就是 了。自從3月份第一家 上線,僅僅幾個月之內,的數量就增加到了1726家。然而,這起風起雲湧的風潮,正在快速的消失中。很多負面的訊息為 這種形式蒙上了陰影。今天,就和大家聊聊 衰敗的原因。的意義,就在於聯合多個消費者實現一次...
美團旅行訂單免費退改政策延至8月底
程式設計客棧 www.cppcns.com 8月5日 訊息 今天,美團官方微博發布公告宣布,為做好新一輪疫情防控工作,平台公升級了旅行訂單疫情程式設計客棧保障內容,免費退改政策延至8月31日。有酒店 民宿 門票退訂或機票 火車票退改簽需求的使用者均可申請免費退訂。適用群體包括酒店 民宿 景區所在區域...