C#项目中常用到的设计模式

发表于:2016-6-30 11:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:禅宗花园...迷失的佛    来源:51Testing软件测试网采编

  4、工厂模式
  工厂模式细分的话有简单工厂模式、抽象工厂模式等。它最核心的就是如何通过 Factory new 一个 对象出来。在ASP.NET MVC 消息处理实现过程中工厂模式运用的非常多。比如
  在MVC中处理一个Request,其实就是调用Controller下的一个Action,这就需要从Url 和Route 中反射出Controller对象,内部由ControllerFactory创建。
 
  它的默认实现是:DefaultControllerFactory
  
  另一个例子是ValueProviderFactory,它使得Controller 下的Action 能够接收到前端传回来的数据并实现模型绑定,是典型的抽象工厂实现。
  image
  5. 订阅模式
  订阅模式在某些项目运用比较多,比如 Knockout 整个项目就是一个大的订阅模式的实现,但是它是用javascript编写的。还有像微博、微信公众号等等订阅模式通常少不了。
  通常可以定义接口:
internal interface ISubject
{
IEnumerable<IObserver> Observers { get; }
void Notify();
void AddObserver(IObserver observer);
void RemoveObserver(IObserver observer);
}
internal interface IObserver
{
void ReceiveSubject(ISubject subject);
}
  实现:
internal class AritcleObserver : IObserver
{
public void ReceiveSubject(ISubject subject)
{
// receive the subject
}
}
class WeChatArticle : ISubject
{
private ICollection<IObserver> _observers;
private string _name;
public WeChatArticle(string name)
{
this._name = name;
this._observers = new List<IObserver>();
}
public IEnumerable<IObserver> Observers
{
get { return this._observers; }
}
public void Notify()
{
foreach (IObserver observer in this._observers)
{
observer.ReceiveSubject(this);
}
}
public void AddObserver(IObserver observer)
{
this._observers.Add(observer);
}
public void RemoveObserver(IObserver observer)
{
this._observers.Remove(observer);
}
}
  6.  责任链模式
  责任链模式没有像工厂模式那样被人熟悉,在ASP.NET WebApi 中有一个非常典型的实现 就是WebApi的消息处理管道HttpMessageHandler
 
  这里给一个简单的模拟
class DataRequest
{
public string FileName { get; set; }
}
class DataResponse
{
public string Error { get; set; }
public string Data { get; set; }
}
internal abstract class RequestHandler
{
public RequestHandler NextHandler { get; set; }
public abstract DataResponse Process(DataRequest request);
}
class ReadRequestHandler : RequestHandler
{
public override DataResponse Process(DataRequest request)
{
return new DataResponse()
{
Data = File.ReadAllText(request.FileName)
};
}
}
class ExistsRequestHandler : RequestHandler
{
public override DataResponse Process(DataRequest request)
{
if (File.Exists(request.FileName))
{
return this.NextHandler.Process(request);
}
else
{
return new DataResponse()
{
Error = "no exists"
};
}
}
}
  7. 组合模式
  组合模式是使得单个对象和组合对象有一致的行为,一致的行为可以理解为拥有同一个接口,比如图形显示
class ControlContext
{
}
internal interface IControl
{
void Draw(ControlContext context);
}
class Line : IControl
{
public void Draw(ControlContext context)
{
}
}
class Circle : IControl
{
public void Draw(ControlContext context)
{}
}
class CompositeControl : IControl
{
private List<IControl> controls;
public CompositeControl(IList<IControl> cons)
{
this.controls = new List<IControl>(cons);
}
public void Draw(ControlContext context)
{
this.controls.ForEach(c => c.Draw(context));
}
public void Add(IControl control)
{
this.controls.Add(control);
}
}
  8. 总结
  市场上有很多关于设计模式的书,但是基本的设计模式大概有20多种,本文给大家介绍了几种项目中常见的设计模式,其实有些设计模式在实际项目已经不知不觉用起来了。
  以后再给大家介绍其他的几种设计模式。
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号