一步步构建多层架构系列二之设计模式运用篇
上節我們講到數據對象創建的管理,那么如何管理數據訪問類的對象創建呢?先從為什么需要設計模式的原理說起吧
?
為了更好的理解設計思想,我盡可能的用實例來演示推進。但隨著需求的增加,程序將越來越復雜。此時就有修改設計的必要,重構和設計模式就可以派上用場了。最后當設計漸趨完美后,你會發現,即使需求不斷增加,你也可以神清氣閑,不用為代碼設計而煩惱了。
?
?
?
Codeusing?System;
using?System.Collections.Generic;
using?System.Text;
/*場景摸擬:
?小明:聽說導演要重拍天龍八部,你去嗎?
?小華:我哪有這個條件啊,不過畢竟我是學影視導演方向的,如果我能做導演就好了。
?小明:去你的,就你那水平,不過,說真的,如果讓你做導演,你會怎么做?
?小華說:我會先招男主角,比如:喬峰和段譽??纯次沂侨绾握械?#xff1f;
?
?*/
namespace?ConsoleApplication3
{
????//我們定義了兩個類喬峰和段譽,并且要求他們都會打,所以我們定了strike方法
????class?Qiaofeng?:?Nanzhujiao
????{
????????public?override?void?strike()
????????{
????????????Console.Write("this?is?qiaofeng's?action");
????????????Console.Read();
????????}
????}
????class?Duanyu?:?Nanzhujiao
????{
????????public?override?void?strike()
????????{
????????????Console.Write("this?is?qiaofeng's?action");
????????????Console.Read();
????????}
????}
????//現在喬峰和段譽都具有打這個方法,為什么我們不能把它們提出來單獨的做成一個類呢?于是我們可以這樣,因為是抽像類,所以不能實便化
????
????public?abstract?class?Nanzhujiao
????{
????????public?abstract?void?strike();
????}
?????
????//現在我要指派喬峰上場了,如何區分到底是誰上場呢?
????
????class?daoyan
????{
????????static?void?test(Nanzhujiao?nan)
????????{
????????????nan.strike();
????????}
????}
?????
????//此時導演如果決定起用虛豬,那么我們僅需要編寫虛豬類即可,其它的可不動。
????//現在三個男主角我們已經全部起用了,現在導演要招女演員了,怎么辦?難道我們還讓王語嫣去繼承男演員嗎?當然不行,那么我們這樣做:
????//我們定義了兩個類王語嫣和穆姐姐
????class?Wangyuyan?:?luzhujiao
????{
????????public?override?void?strike()
????????{
????????????Console.Write("this?is?Wangyuyan's?action");
????????????Console.Read();
????????}
????}
????class?Mujiejie?:?luzhujiao
????{
????????public?override?void?strike()
????????{
????????????Console.Write("this?is?Mujiejie's?action");
????????????Console.Read();
????????}
????}
????//現在王語嫣和穆姐姐都具有打這個方法
????
????public?abstract?class?luzhujiao
????{
????????public?abstract?void?strike();
????}
????
????//現在導演覺得太煩了,既要管男演員,又要管女演員,太累了,于是導演定義了一個標準:要都會打就行了。
????//因為接口這個利器你還沒有用上(雖然你也可以用抽象類,但在C#里只支持類的單繼承)
????public?interface?Inormal
????{
????????void?strike();????
????}
????//不管是男演員還是女演員都要照標準做,于是:
?我們修改上面的兩個抽象類,讓它們實現上面的Inormal,如下:
?
Code????public?abstract?class?Nanzhujiao?:?Inormal
????{
????????public?abstract?void?strike();
????}
????public?abstract?class?luzhujiao?:?Inormal
????{
????????public?abstract?void?strike();
????}
通過上面的分析,我們現在可以讓導演來指派該誰上場了:如下:
?
Code//于是,導演就可以用下面的方法來指派人了
????
????public?class?daoyan
????{
???????public?static?void?test(Inormal?nan)
????????{
????????????nan.strike();
????????}
????}
????//我們可以得出這樣一個結論:在調用類對象的屬性和方法時,盡量避免將具體類對象作為傳遞參數,而應傳遞其抽象對象,
????//更好地是傳遞接口,將實際的調用和具體對象完全剝離開,這樣可以提高代碼的靈活性。
?
Code//下面來看看我們如何去調用
????class?Program
????{
????????
????????static?void?Main(string[]?args)
????????{
?????????????????????
???????????Inormal?nan1=null;
???????????string?arg?=?"wangyuyan";//此處可以根據下拉框選擇來選定
????????????switch?(arg)
????????????{
????????????????case?"Qiaofeng":
????????????????????nan1?=?new?Qiaofeng();
????????????????????break;
????????????????case?"Duanyu":
????????????????????nan1?=?new?Duanyu();
????????????????????break;
????????????????case?"wangyuyan":
????????????????????nan1?=?new?Wangyuyan();
????????????????????break;
????????????}
????????????daoyan.test(nan1);
????????}
????}
?
這些討厭的switch語句又出現了,有沒方法把這些煩煩的switch消掉呢。我們來努力一下,該是讓工廠模式來生產對象的時候了:
?
Code?public?interface?IcreateFactory
????{
????????Inormal?CreateObject();
????}
????public?class?qiaofengCreate?:?IcreateFactory
????{
???????public?Inormal?CreateObject()
????????{
????????????return?new?Qiaofeng();
????????}
????}
????public?class?wangyuyianCreate?:?IcreateFactory
????{
???????public?Inormal?CreateObject()
????????{
????????????return?new?Wangyuyan();
????????}
????}
?
?這樣,由工廠模式直接創造出對象,比如:喬峰,段譽,王語嫣等,下面就可以這樣調用了:
??????????? IcreateFactory i = new qiaofengCreate();
??????????? i.CreateObject().strike();
通過以上方法我們部分的消除了switch語句,因為總是要用條件去判斷到底該實例化哪個類。幸運的是,.net給我們提供了一種非常好的機制來消除這種現象,這就是利用類名反射,我們來看一下如何做:
首先,在web.config文件中添加如下配置:
?
?
Code????<appSettings>
????????<add?key="WebDAL"?value="Pyllot.EC.Cargo.SqlServerDAL"/>
????????<!--數據庫連接字符串-->
????????<add?key="SiteSqlServer"?value="Server=(local);Database=Northwind;uid=sa;pwd=sa;"/>
????????<add?key="SiteMySql"?value="Host=localhost;port=3306;UserName=root;Password=mfm;Database=ec_cargo;"/>
????</appSettings>
?然后動態根據類名反射,從而動態實例化類,如下:
?
Code????????public?static?Pyllot.EC.Cargo.IDAL.ICategory?CreateCategory()
????????{
????????????string?className?=?ConfigReader.Read("WebDAL")?+?".Category";
????????????return?(Pyllot.EC.Cargo.IDAL.ICategory)Assembly.Load(ConfigReader.Read("WebDAL")).CreateInstance(className);
????????}
那么,上面的switch或工廠模式可以統統丟掉了,我們僅需要將以上的.Category改為qiaofeng,wangyuyan等,另外改一下配置文件中的目錄即可。
好了,這個系列二分析了面向對象的封裝,繼承,抽像,接口,工廠模式,下一系列我們將這種思想活用于架構中,敬請期待
?
?
轉載于:https://www.cnblogs.com/mfm11111/archive/2009/02/24/1397507.html
總結
以上是生活随笔為你收集整理的一步步构建多层架构系列二之设计模式运用篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle学习笔记:redo重做日志
- 下一篇: 快速写出较好CSS的5种方法