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多种,本文给大家介绍了几种项目中常见的设计模式,其实有些设计模式在实际项目已经不知不觉用起来了。
以后再给大家介绍其他的几种设计模式。