日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

如何编写优雅的代码:07. 设计模式应用案例(下)

發(fā)布時間:2023/12/18 asp.net 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何编写优雅的代码:07. 设计模式应用案例(下) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前文用C#代碼實現了Facade模式、Adapter模式、Strategy模式、Bridge模式和Abstract Factory模式解決實際業(yè)務需求。本文將繼續(xù)以C#代碼為例,實現我在前面介紹的11個模式中剩下的6個模式:Decorator模式、Observer模式、Template Method模式、Singleton模式、Factory Method模式和Prototype模式。按照實現方法的不同,該11個模式可分成三類:創(chuàng)建型模式(Abstract Factory, Singleton, Factory Method, Prototype)、結構型模式(Adapter, Bridge, Decorator)和行為型模式(Strategy, Observer, Template Method)。

.Decorator模式

業(yè)務場景:在中國銷售的一塊手表,基本配置是顯示北京時間,但也提供帶有高級功能的配置。如:中端配置支持顯示當前時區(qū)下的日期、高端配置支持第二時區(qū)(具體可以用戶設置)。采用Decorator模式實現的代碼如下:

namespace PartternCase {public abstract class AbstractWatch{//Component in UMLpublic abstract void StartWork();}public class Watch : AbstractWatch{//ConcreteComponent in UMLpublic override void StartWork(){//Show Beijing time }}public abstract class WatchDecorator : AbstractWatch{//Decorator in UMLprotected AbstractWatch Watch { get; set; }protected WatchDecorator(AbstractWatch watch){Watch = watch;}}public class ShowDateDecorator : WatchDecorator{//ConcreteDecoratorA in UMLpublic ShowDateDecorator(AbstractWatch watch): base(watch){}public override void StartWork(){Watch.StartWork();//Show date of current time zone }}public class ShowSecTimeZoneDecorator : WatchDecorator{//ConcreteDecoratorB in UMLpublic ShowSecTimeZoneDecorator(AbstractWatch watch): base(watch){}public override void StartWork(){Watch.StartWork();// Show time of sencond timezone }}public class Client{//How to use decorator patternpublic void ChooseWatch(){var watch = new Watch();//Basic functionvar middleWatch = new ShowDateDecorator(watch);//Middle: contain show date functionvar advanceWatch = new ShowSecTimeZoneDecorator(middleWatch);//Advance: contain show date and second time zone function }} }

.Observer模式

業(yè)務場景:盛天公司內部的報銷有嚴格的審批流程,為提高審批效率,當員工提交報銷單時,需要向具有審批權限的領導自動發(fā)送申請審批的郵件(當然,除報銷單外,領導還會收到其他類型的審批郵件)。采用Observer模式實現的代碼如下:

namespace PartternCase {public abstract class Report{//Subject in UMLpublic string Status { get; set; }protected IList<Employee> Employees { get; set; }public void Attach(Employee employee){Employees = Employees ?? new List<Employee>();Employees.Add(employee);}public void Detach(Employee employee){if (Employees == null) { return; }Employees.Remove(employee);}public void Notify(Report report){if (Employees == null) { return; }foreach (var employee in Employees){employee.HandleReportSubmit(report);}}}public class ExpenseReport : Report{//ConcreteSubject in UMLpublic void Submit(){Status = "Report Submited";Notify(this);}}public abstract class Employee{//Observer in UMLpublic abstract void HandleReportSubmit(Report report);}public class Boss : Employee{//ConcreteObserver in UMLpublic string Status { get; set; }public override void HandleReportSubmit(Report report){// Send email to this boss by smtp serverStatus = report.Status;}}public class Client{//How to use observer patternpublic void Observer(){var boss1 = new Boss();var boss2 = new Boss();var expense = new ExpenseReport();expense.Attach(boss1);expense.Attach(boss2);expense.Submit();}} }

.Template Method模式

業(yè)務場景:圣象飲料公司生產牛奶和礦泉水兩種飲料。運營過程都分為生產和銷售兩個環(huán)節(jié),但兩種飲料的生產和銷售方式不相同。如銷售方式:牛奶每天通過送貨員送貨上門,礦泉水通過各大超市銷售。采用Template Method模式實現的代碼如下:

namespace PartternCase {public abstract class DrinkOperation{//AbstractClass in UMLpublic void Perform(){//Interface for client call Product();Sales();}protected abstract void Product();protected abstract void Sales();}public class MilkOperation : DrinkOperation{//ConcreteClass in UMLprotected override void Product(){//Get raw material from milk station then process }protected override void Sales(){//Sell by deliveryman }}public class WaterOperation : DrinkOperation{//ConcreteClass in UMLprotected override void Product(){//Get raw material from mountain then process }protected override void Sales(){//Sell by supermarket }} }

. Singleton模式

業(yè)務場景:投資組合管理系統(tǒng)中經常會用到一些復雜的模型對投資組合的價值進行估值。這些計算模型往往都放在一個類中,互相之間沒有依賴關系。采用Singleton模式實現的代碼如下:

namespace PartternCase {public class CalculationEngine{//Singleton in UMLprotected CalculationEngine() { }private static readonly CalculationEngine instance = new CalculationEngine();public static CalculationEngine GetInstance { get { return instance; } }// Interface for client call//Many calculation methods } }

. Factory Method模式

業(yè)務場景:圣天基金公司旗下的基金在向合伙人提款時,需根據合伙人類型不同(普通合伙人:GP、有限合伙人:LP)將提款數據存放在相應的合伙人類型中,然后保存。采用Factory Method模式實現的代碼如下:

namespace PartternCase {public abstract class CapitalCall{//Creator in UMLpublic abstract Partner BuildPartner();public void Perform(){var partner = BuildPartner();//Calculate amount of partner then save partner }}public class GpCapitalCall : CapitalCall{//ConcreteCreator in UMLpublic override Partner BuildPartner(){return new GP();}}public class Partner{//Product in UMLpublic decimal Amount { get; set; }}public class GP : Partner{//ConcreteProduct in UML } }

. Prototype模式

業(yè)務場景:圣象飲料公司在查詢牛奶和礦泉水的季度銷量時,會分別針對Milk和Water數據庫表進行查詢,查詢條件除時間外從外部傳入,內部只設置時間條件,但不能改變傳入的查詢條件。下面將采用Prototype模式實現該業(yè)務場景:

namespace PartternCase {public abstract class DrinkCriteria{//Prototype in UMLpublic abstract string QueryTable { get; }public DateTime StartDate { get; set; }public DateTime EndDate { get; set; }//Other query fieldspublic abstract DrinkCriteria Clone();}public class MilkCriteria : DrinkCriteria{//Concrete Prototype1 in UMLpublic override string QueryTable { get { return "Milk"; } }public override DrinkCriteria Clone(){//This is shallow copy, in other case maybe need deep copy.return MemberwiseClone() as MilkCriteria;}}public class WaterCriteria : DrinkCriteria{//Concrete Prototype2 in UMLpublic override string QueryTable { get { return "Water"; } }public override DrinkCriteria Clone(){return MemberwiseClone() as WaterCriteria;}}public class Client{//Client in UML//Set relative criteria at runtimeprivate DrinkCriteria Criteria { get; set; }public void HowToUse(){var newCritera = Criteria.Clone();//newCritera.StartDate = 2013-1-1;//newCritera.EndDate = 2013-3-31;//Start to query user new criteria }} }

轉載于:https://www.cnblogs.com/zhouwei0213/p/3358224.html

總結

以上是生活随笔為你收集整理的如何编写优雅的代码:07. 设计模式应用案例(下)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。