如何编写优雅的代码:07. 设计模式应用案例(下)
前文用C#代码实现了Facade模式、Adapter模式、Strategy模式、Bridge模式和Abstract Factory模式解决实际业务需求。本文将继续以C#代码为例,实现我在前面介绍的11个模式中剩下的6个模式:Decorator模式、Observer模式、Template Method模式、Singleton模式、Factory Method模式和Prototype模式。按照实现方法的不同,该11个模式可分成三类:创建型模式(Abstract Factory, Singleton, Factory Method, Prototype)、结构型模式(Adapter, Bridge, Decorator)和行为型模式(Strategy, Observer, Template Method)。
一.Decorator模式
业务场景:在中国销售的一块手表,基本配置是显示北京时间,但也提供带有高级功能的配置。如:中端配置支持显示当前时区下的日期、高端配置支持第二时区(具体可以用户设置)。采用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模式
业务场景:盛天公司内部的报销有严格的审批流程,为提高审批效率,当员工提交报销单时,需要向具有审批权限的领导自动发送申请审批的邮件(当然,除报销单外,领导还会收到其他类型的审批邮件)。采用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模式
业务场景:圣象饮料公司生产牛奶和矿泉水两种饮料。运营过程都分为生产和销售两个环节,但两种饮料的生产和销售方式不相同。如销售方式:牛奶每天通过送货员送货上门,矿泉水通过各大超市销售。采用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模式
业务场景:投资组合管理系统中经常会用到一些复杂的模型对投资组合的价值进行估值。这些计算模型往往都放在一个类中,互相之间没有依赖关系。采用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模式
业务场景:圣天基金公司旗下的基金在向合伙人提款时,需根据合伙人类型不同(普通合伙人: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模式
业务场景:圣象饮料公司在查询牛奶和矿泉水的季度销量时,会分别针对Milk和Water数据库表进行查询,查询条件除时间外从外部传入,内部只设置时间条件,但不能改变传入的查询条件。下面将采用Prototype模式实现该业务场景:
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. 设计模式应用案例(下)相关推荐
- Python好书推荐《Python代码整洁之道》——编写优雅的代码
前言 Python是当今最流行的语言之一.相对较新的领域如数据科学.人工智能.机器人和数据分析,以及传统的专业如Web开发和科学研究等,都在拥抱Python.随着时间的推移,Python有可能会发展成 ...
- 如何编写优雅的代码:06. 设计模式应用案例(上)
前文一共介绍了四人帮(Gang of Four)总结的的11个设计模式,对初学者而言,光看文字描述和UML类图略显抽象.本着Learning in Doing的原则,本文将举一些实际的业务需求场景,以 ...
- Go Code Review Comments 翻译 编写优雅golang代码
Gofmt 在 Go 代码上运行 gofmt 以自动修复大多数的机械性风格问题.几乎所有不正规的 Go 代码都在使用gofmt.本文档的剩余部分涉及非机械性风格问题. 另一种方法是使用 goimpor ...
- [转]新兵训练营系列课程——编写优雅代码
原文:http://weibo.com/p/1001643877361430185536 课程大纲 什么是好代码 如何编写优雅的代码 如何做出优雅的设计 如何规划合理的架构 如何处理遗留代码 什么是好 ...
- 软件工程师,要么不写代码,要么就写优雅的代码
何为优雅的代码 优雅的代码,至少需要遵循以下几个原则: 遵守规范 优雅的代码,首先让人看起来就是很整洁的.而这种整洁,则来源于代码规范.严格地遵守代码规范,是提高且保证代码质量的最有效方法.从个人开发 ...
- 参与知乎 live — 编写优雅的前端业务代码总结
知乎 live 原地址:编写优雅的前端业务代码 前言 当我们在写业务代码的时候,我们到底在写什么? 其实是对交互的一些处理.所有的交互都是基于用户或者浏览器的一些行为来触发的,比如渲染页面,在页面on ...
- html5转apicloud,使用APICloud编写优雅的HTML5代码
使用APICloud编写优雅的HTML5代码<一>一.实现下拉刷新: 默认样式>代码清晰简洁明了,符合ECMA262规范的callback,最少只需5行代码: apiready = ...
- 【QMT策略编写】如何优雅地调教QMT量化平台编写量化策略(使用notepad++、pycharm、vscode等外部IDE编写量化交易代码)
如何优雅地调教QMT量化平台编写量化策略(使用notepad++.pycharm.vscode等外部IDE编写量化交易代码) 前言 一.先搞清楚QMT的安装目录 二.QMT调教步骤 1.QMT里新建量 ...
- [译]编写优雅的JavaScript代码 - 最佳实践
[原文]: devinduct.com/blogpost/22- 有没有似曾相识 如果你对于代码,除了关注是否能准确的执行业务逻辑,还关心代码本身是怎么写的,是否易读,那么你应该会关注如何写出干净优雅 ...
最新文章
- python散点图拟合曲线-python曲线拟合
- matlab中调用cplex 以及使用 Yalmip 工具箱
- us域名在哪里注册_独立站如何选择一个合适的域名?
- .NET 5.0 RC 2 发布,正式版将在 11 月 .NET Conf 大会上发布
- python求平行四边形面积_python 已知平行四边形三个点,求第四个点的案例
- littlevgl 透明按钮_张家港3-10吨叉车日租价格透明2020
- php time豪秒_PHP精确到毫秒秒杀倒计时实例详解
- 负载均衡和故障转移的使用案例
- 写程序/算法的一点思考
- 淘宝类目 API数据接口
- memcached可视化工具 treeNMS通用的安装方法(windows、mac、linux)
- office 打开wps乱_Word 打开WPS文档成乱码的解决方法
- 蓝色理想的flex教材不能在flex Development做不能使用,我整理一下供初学者参考
- QIIME 2教程. 07Cell帕金森小鼠Parkinson's Mouse(2021.2,最佳实战)
- X-Plane飞行模拟器购买安装
- funcode小游戏暑假大作业,开源,新颖,游戏名:凿空,免费。
- 活动、节假日、促销等营销方式的因果效应评估——方法模型篇(二)
- 软件打开显示未选定服务器ip,LtusNtes常见问题大汇总 .doc
- 使用微信公众号对接阿里妈妈后台,实现查卷返利机器人功能
- 每日一题之 hiho235周 润秒(简单模拟)
热门文章
- Spring MVC原理学习之how is return type handled
- Spring XSD validation cache issue
- 使用node https module创建服务器遇到的mac verify failure错误消息
- SAP CRM settype的创建,背后发生了什么
- 使用BAPISDORDER_GETDETAILEDLIST创建S/4HANA的Outbound Delivery
- ElasticSearch常用命令记录
- easyswoole和mixphp_swoole框架都有哪些
- 最小表达式_C# 09.找最大和最小的数字
- linux cp 目录不存在自动创建,Linux运维知识之Linux:复制并创建目标目录,如果它不存在...
- 提高c 语言的方法,提高C程序效率的方法