數據結構~站點地圖其實是(shi)一顆(ke)樹
解放(fang)思想與(yu)面(mian)向對象兩個(ge)東西(xi)有什么(me)聯系(xi),怎么(me)把它們放(fang)在一(yi)起(qi)去(qu)說了呢,呵呵,解放(fang)思想實(shi)事上是指將我們的(de)(de)習慣性(xing)思維(wei)進行(xing)改變(bian),使用另一(yi)種(zhong)方(fang)式來有效的(de)(de)解決(jue)一(yi)個(ge)問題(ti),而這種(zhong)解決(jue)問題(ti)的(de)(de)方(fang)法(fa)往(wang)往(wang)是通過(guo)面(mian)向對象的(de)(de)特性(xing)去(qu)實(shi)現的(de)(de)。
今天(tian)要說的是“站點地圖(tu)也(ye)要面(mian)向對象“,我們通(tong)過在做站點地圖(tu)時,都是直接寫死在頁面(mian)上的,這種方(fang)法的缺點就(jiu)是修(xiu)改起來比較麻煩,不易于擴展,如果要修(xiu)改一個(ge)樣式,那就(jiu)要命了,你要一個(ge)頁面(mian)一個(ge)頁面(mian)的去改,呵呵。
我(wo)們應該把它進行抽象(xiang),來吧,請(qing)進入面(mian)向(xiang)對象(xiang)的(de)世(shi)界里來,這里的(de)世(shi)界是那(nei)么(me)的(de)美,他給開發人員(yuan)帶(dai)來的(de)不僅(jin)是工作(zuo)量少(shao)了(le)(le),更(geng)重要的(de)是使問題更(geng)加(jia)清晰了(le)(le),代(dai)碼(ma)藝術性更(geng)加(jia)強了(le)(le),這對于一個枯燥的(de)行業來說(shuo)是至關重要的(de)。
書歸正傳
首頁 > 用戶中心 > 我的訂單
首頁 > 用戶中心 > 個人信息
上(shang)面的說明(ming),很容易(yi)讓我(wo)們想(xiang)到的樹型結(jie)構(gou)(gou),沒錯,就是樹型結(jie)構(gou)(gou),有(you)時(shi),我(wo)們在開(kai)發程序時(shi),運用合適數據(ju)結(jie)構(gou)(gou)可以幫(bang)助我(wo)們解決不少問(wen)題,思路(lu)清(qing)晰(xi)了(le),性能(neng)上(shang)去了(le),感(gan)覺把復雜的問(wen)題也簡單化(hua)了(le),呵呵。
看(kan)看(kan)我(wo)的SiteMapTree
/// <summary> /// 站點地(di)圖(tu) /// 樹型結構 /// </summary> public class SiteMapTree { public SiteMapTree() { } public SiteMapTree(int id, string name, string linkUrl, bool isCurrent, int? parentID) { this.ID = id; this.Name = name; this.LinkUrl = linkUrl; this.IsCurrent = isCurrent; this.ParentID = parentID; } public int ID { get; set; } public string Name { get; set; } public string LinkUrl { get; set; } public bool IsCurrent { get; set; } public int? ParentID { get; set; } public List<SiteMapTree> Sons { get; set; } public SiteMapTree Father { get; set; } public static List<SiteMapTree> Data = new List<SiteMapTree>(); /// <summary> /// 初始化,填充基礎數(shu)據 /// </summary> public static void Init() { Data.Add(new SiteMapTree(1, "網站(zhan)首(shou)頁", "#", false, null)); Data.Add(new SiteMapTree(2, "用(yong)戶中心", "#", false, 1)); Data.Add(new SiteMapTree(3, "訂單中(zhong)心(xin)", "#", false, 2)); Data.Add(new SiteMapTree(4, "個人信息", "#", false, 2)); } }
而上面的類(lei)型(xing)我(wo)們通常稱(cheng)為實(shi)體(ti)(ti)類(lei),而對(dui)于(yu)它(ta)的具體(ti)(ti)操作(zuo),可以(yi)通過一個功能類(lei)實(shi)現(xian),事(shi)實(shi)上,對(dui)于(yu)這種樹型(xing)結構來(lai)說,我(wo)們可以(yi)抽(chou)象出一個樹型(xing)結構操作(zuo)類(lei),下
面我將一(yi)些(xie)常用的(de)操作進(jin)行(xing)了實現。
/// <summary> /// 樹的操(cao)作(zuo) /// </summary> public class Tree { List<SiteMapTree> Data; public Tree(List<SiteMapTree> data) { this.Data = data; } #region 樹的裝載 public SiteMapTree GetCompleteTree() { var root = Data.First(i => !i.ParentID.HasValue); GetSubTree(root); return root; } void GetSubTree(SiteMapTree tree) { List<SiteMapTree> sons = Data.Where(i => i.ParentID == tree.ID).ToList(); tree.Sons = sons; sons.ForEach(i => { i.Father = tree; GetSubTree(i); }); } #endregion #region 得到不完整的樹 public SiteMapTree GetTree(int id) { var root = Data.First(i => i.ID == id); GetSubTree(root); return root; } #endregion #region 通過葉子節點得到它所有祖輩節點 public SiteMapTree GetAllFather(int id) { var root = Data.FirstOrDefault(i => i.ID == id); if (root != null) { GetFatherTree(root); } return root; } void GetFatherTree(SiteMapTree tree) { SiteMapTree father = Data.FirstOrDefault(i => i.ID == tree.ParentID); if (father != null) { tree.Father = father; GetFatherTree(father); } } #endregion }
上面(mian)的功能類,并(bing)不是(shi)很抽象,因為我(wo)沒有(you)去把它(ta)通用化(hua),如(ru),沒有(you)建(jian)立泛型機制(zhi),沒有(you)定義樹型結構的統一(yi)接口(kou)等(deng)等(deng),當然這(zhe)在(zai)本例中不是(shi)重要的,接下來,我(wo)
們來看一下在具體環境中如何去使(shi)用這個(ge)站(zhan)點地圖:
/// <summary> /// 建立一個站點(dian)地圖 /// </summary> /// <param name="?"></param> /// <param name="activeCss"></param> /// <returns></returns> public static MvcHtmlString CreateSiteMapTree( this HtmlHelper html, object id, string activeCss) { if (id == null) return null; int _id = Convert.ToInt32(id); SiteMapTree.Init(); Tree tree = new Tree(SiteMapTree.Data); if (tree == null) return null; var entity = tree.GetAllFather(_id); entity.IsCurrent = true; StringBuilder result = new StringBuilder(); FillFatherTree(result, entity, activeCss, true); result.Insert(0, "<div class='lx_indexcen_subnav'>"); result.Append("</div>"); return MvcHtmlString.Create(result.ToString()); } static void FillFatherTree(StringBuilder result, SiteMapTree tree, string activeCss, bool isHtml) { if (tree != null) { if (isHtml) { result.Insert(0, string.Format("<a href='{0}' title='{1}' class='{2}'>{1}</a>" , tree.LinkUrl , tree.Name , tree.IsCurrent ? activeCss : string.Empty)); } else { result.Append(tree.Name + "-"); } FillFatherTree(result, tree.Father, activeCss, isHtml); } }
在具體action中去(qu)調用它
ViewData["SiteMapID"] = SiteMapID;
事實上,上面的ViewData["SiteMapID"]一般是在母板頁里進行展(zhan)示的,呵呵。