总结下~~:->/Files/ajaxren/寻源之旅.rar
1针对接口编程,而不是针对实现编程
-客户无须知道所使用对象的特定类型,只需要知道对象有客户所期望的接口
2优先使用对象组合,而不是类继
承继承通常为"白箱复用",对象组合称为黑箱复用,继承在某种程度上
破坏了类的封装性,子类父类耦合度高,对象组合只要求被组合的对象有良好的接口,耦合低
3封装变化点
使用封装来创建对象之间的分界层,让设计者可以在分界层的一端修改而不影响另一端
--ok废话多了点~~请注意红色的地方~~
这个模式就是利用克隆来得到新的对象,克隆就是说所有的成员都会连同们保存的数据一起被克隆
,实际上就是开辟一个新的地址比如
上面是标准的做法,确实没有什么问题- -很好
上图第一部分是浅拷贝,当有个非值类型-〉200出现的时候,上下同时引用,
上图第二部分深层拷贝则是不会出现这个问题- -找到源头了
//--测试代码
//--这个是测试结果
d<c<a<b
分析下:
d:是浅层拷贝
NormalActrowA na1 = (NormalActrowA)this.MemberwiseClone();
c:深层拷贝~一个元素一个元素的拷贝
NormalActrowA na1 = new NormalActrowA();
na1.a = this.a;
na1.pi.b = this.pi.b;
na1.pi.S1 = this.pi.S1;
na1.pi.T = this.pi.T;
na1.pi["dd"] = na1.pi["dd"];
a:深层拷贝:先拷自己,在拷贝引用--I Like
NormalActrowA na1 = (NormalActrowA)this.MemberwiseClone();
na1.pi = (p)this.pi.Clone();
c:序列化
NormalActrowA na1;
System.IO.MemoryStream memoryStream = new System.IO.MemoryStream();
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
formatter.Serialize(memoryStream, this);
memoryStream.Position = 0;
//--利用反序列化
na1 = (NormalActrowA)formatter.Deserialize(memoryStream);
na1.pi.b = 12;
Console.WriteLine("经过克隆更改的数据:{0}", ((NormalActrowA)na1).pi.b);
Console.WriteLine();
Console.WriteLine("原始数据 :{0}", this.pi.b);
return na1;
我个人比较喜欢:a 性价比试中..如果您有更好的方法- -分享下谢谢咯