C#设计模式(学习笔记[01])
注意,这里讨论的设计模式都在C#中的。
一个设计模式的目的代表了一个需求,而这个需求是C#语言提供的一般机制所无法满足的, 例如,C#语言对定义一个类所实现的接口提供了充分的支持,但是如果你希望改变一个类的接口来满足客户的需求,那么你就必须应用适配模式(Adapter),然而,C#语言的接口机制并没有提供适配器模式。
本书《C#设计模式》把设计模式分为以下5类:
接口型模式(Interfaces)
职责型模式(Responsibility)
构造型模式(Construction)
操作型模式(Operations)
扩展型模式(Extensions)
根据模式目的对模式进行分类
目的 |
模式 |
接口 |
适配器模式,外观模式,合成模式,桥接模式 |
职责 |
单件模式,观察者模式,中介模式,代理模式,职责链模式,享元模式 |
构造 |
生成器模式,工厂方法模式,抽象工厂模式,原型模式,备忘录模式 |
操作 |
模板方法模式,状态模式,策略模式,命令模式,解释模式 |
扩展 |
装饰模式,迭代模式,访问模式 |
模式是人类智慧的结晶,它提供了标准的习惯用语,这些习惯用语定义了相关领域中,定有经验的实践者们所应用的概念。
接口型模式介绍
抽象的说,一个类的接口(interface)是这个类的某些方法(method)和字段(field)构成的一个集合。其它类的实例可以通过这个集合对这个类进行访问。接口通常表达了方法执行所提供的功能职责。
C#语言改进了接口的概念,使之可以单独进行构造,从而把接口(即:一个类必须做什么)和实现(implementation,即:一个对象如何满足其功能职责)有效地区分开。
C#中,一个类可以实现多个接口,同时,接口可以充许被多个类实现(即多个类实现同一个功能)。
接口与抽象类:
接口与抽象类的几点区别:
在使用上,一个没有提供抽象方法的抽象类与一个接口是类似的(没看明白的请再重新读一遍)。然而我们要注意以下几点区别:
1. 一个类可能实现多个接口,但是最多只能对一个抽象类进行子类化。即C#里不支持多态,然而你可以用接口进行弥补。
2. 一个抽象类可以包括非抽象的方法,而一个接口的所有方法在效果上都是抽象的。
3. 一个抽象类可以声明并使用变量,而一个接口不能。
4. 一个抽象类的方法的访问修饰可以是任意的(public, internal, protected, protected internal, private),然而一个接口的访问修饰符只能是public,而且你不能指定,只能是默认的public。
5. 一个抽象类可以定义构造函数,而一个接口不行。
接口与委托
一个C#接口可以包容方法,C#属性(property),以及索引器(index)。一个接口也可以包容事件,但不能包容委托。为什么?
关于C#里的委托,请参考这篇文章。
http://www.cnblogs.com/WuCountry/archive/2006/11/29/576030.html
接口与属性
C#的属性是依懒于语法的。说明一下C#的属性语法:
public int Age{
get{return this._age;}
set{
if(value>=20&&value<=100) this._age=value;
else throw new Exception(“Out of age range.”);
}
}
上面的属性定义完全是基于C#语法的,经过编译器编译后,会在类上添加两个函数,一个用于get_Age,另一个是set_Age,因此当你用工具查看编译后的IL代码时,不要感到奇怪(因为我遇到过对此不理解的人,还以为是.net的BUG,所以在这里多次一举的解释一下)。
接口的细节
如果你觉得你对C#的接口已经很了解的,可以跳过这里,否则请试着判断以下问题是否正确:
1. 一个接口定义了一个合约。
2. 接口可以包容方法,C#属性,委托及索引器。
3. 一个接口声明至少声明一个成员。
4. 所有接口成员默认的访问类型都是public的。
5. 你可以自己定义接口的访问类型,即可以添加成员修饰符(modifier)。
6. 与一个非抽象类类似,一个抽象类必须提供接口中所有成员的实现,只要这些成员在这个类的基中出现过。
普通接口无法提供的内容
每一个设计模式的目的是:在一个特定的语境(context)中解决一个问题。基于接口的模式强调了语境,因为语境决定了我们是否需要定义或者重新定义对方法的访问手段。
接口型模式是其它几种模式的基础,慢慢学习。