单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。
开放封闭原则:对于扩展是开放的,对于修改是封闭的。无论模块是多么的"封闭",都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。
依赖倒转原则:抽象不应该依赖细节,细节应该依赖于抽象,说白了就是要针对接口编程,依赖抽象或接口编程。
里氏替换原则:只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正的被复用,而子类也能够在父类的基础上增加新的行为。
里氏替换原则:父类引用指向子类对象Person p=new Chinese();(隐式类型转换)
里氏替换原则:定义一个方法的时候,返回类型是父类型,而实际返回是子类型的对象
代理模式:为其他对象提供一种代理以控制对这个对象的访问。例:秀才让小六代其求婚。
迪米特法则(最少知识原则):如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用,强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限。也就是说,一个类包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开,其根本思想是强调了类之间的松耦合。
迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。---foreach in
迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据。
foreach执行原理
foreach来循环遍历某类型,这个类型必须实现了IEnumerable接口,实现public IEnumerator GetEnumerator()方法
GetEnumerator()方法该方法返回IEnumerator类型的对象,此方法不是用来遍历,而是用来得到一个迭代器,这个迭代器才是用于遍历的对象
foreach循环是只读的,不能用来修改数据
foreach循环式只进的,并且是一条一条循环的
#region 自定义迭代器
MyList list = new MyList() { Name="yzk",Age=18,Height=180};
//foreach (var item in list)
//{
// Console.WriteLine(item);
//}
//拆解foreach执行过程:
IEnumerator e1 = list.GetEnumerator();//foreach list
if (e1.MoveNext())//in
{
var item = e1.Current;//enu.Current;迭代器中的指针,指向当前的元素
Console.WriteLine(item);
}
if (e1.MoveNext())//in enu.MoveNext();完成指针的移动,逐个遍历所有元素,如果后边没有元素,则返回false
{
var item = e1.Current;
Console.WriteLine(item);
}
if (e1.MoveNext())//in
{
var item = e1.Current;
Console.WriteLine(item);
}
if (!e1.MoveNext())//这时已经没有项了,所以返回false退出循环
{
//break;
Console.WriteLine("退出迭代器的遍历");
}
#endregion