- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
设计模式参考资料
设计模式学习笔记(一)——面向对象设计模式与原则
今天听了《C#面向对象设计模式纵横谈(1):面向对象设计模式与原则》课程。总结了一些笔记。
首先介绍了什么是设计模式:设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。
下面主要讨论面向对象设计模式。
面向对象设计模式描述了类与相互通信的对象之间的组织关系。目的是应对变化、提高复用、减少改变。
那到底什么是对象:
从概念层面讲,对象是某种拥有职责的抽象;
从规格层面讲,对象是一系列可以被其他对象使用的公共接口;
从语言实现层面来看,对象封装了代码和数据(也就是行为和状态)。
对于这三点,我理解最深的应该是第三点。这可能和我把大多精力放在了代码实现上有关,然而忽略了编程的思想。如果我们抛开代码的实现来看对象的概念,那么它应该就像一个具体的物体,比如说:榔头,从概念层面讲,榔头有它的职责,也就是它是做什么用的(用来砸钉子,当然还会有其他用途,如防身),从规格层面讲,比如人使用榔头砸钉子。
面向对象的设计模式有三大原则:
1、对接口编程,而不是针对实现编程。在知道设计模式之前,我对接口的出现很不理解。不明白为什么这个什么都不能实现的东西会存在,当然,也对多态表示茫然。实际上我是还没有理解面向对象编程的思想。在对设计模式略有了解后发现接口的确是一个好东西,用它实现多态的确减少了代码的修改。
比如说在《Head First Design Patterns》中有一个例子,说一个有关鸭子的游戏。游戏当中有很多种的鸭子,如:野鸭,木头鸭,鸭子模型。我们首先会想到做一个抽象类:abstract class Duck,Duck当中有很多的抽象属性和方法,如quack。我们用子类继承的时候都会实例化这个方法。
public abstract class Duck
{
public abstract void quack()
}
public class MallardDuck:Duck
{
public override void quack()
{
Console.Write(I can quack);
}
}
当程序成型后,我们有了很多种鸭子,突然,我们发现有的鸭子会飞,我们会在Duck中在加上一个抽象方法abstract void fly();于是我们不得不在所有的子类当中添加fly的实现,有人会说,如果我们在Duck中直接添加fly的实现,不久不用在子类中添加实现了吗?那老板就该问你:你见过木头鸭子满天飞(哦,天啊!木头鸭子也飞起来了,这是什么世界!)。对不起老板,现在咱们都见到了。
这时我们换一种想法,如果我们把这些方法都提取出来,把它变成Duck的成员,好像问题就会简单些。
哈哈,好像扯的有点远了,现在回来接着记我的笔记。
2、优先使用对象组合,而不是类的继承。
这就使说多使用“has a”,少使用“is a”,哈哈,我又想说回刚才的例子。换个角度考虑Duck及其功能,我们设计一个fly的接口和一些具体的飞行方法。
public interface FlyBehavior
{
void fly();
}
public class FlyWithWing:FlyBehavior
{
public void fly()
{
Console.Write(I can fly\n);
}
}
public class FlyNoWay:FlyBehavior
{
public void fly()
{
Console.Write(I cant fly\n);
}
}
好了,对于Duck来说,现在它应该有一个(has a)fly的方法
public abstract class Duck
{
public Duck()
{}
public FlyBehavior flybehavior;
}
现在我们再来实现两种鸭子
public class ModelDuck:Duck
{
public ModelDuck()
{
flybehavior = new FlyNoWay();
}
}
public class MallardDuck:Duck
{
public MallardDuck()
{
flybehavior = new FlyWithWing();
}
}
这样如果要是在加上某种行为的话,我们就不必在每一种鸭子上下功夫。把注意力放在我们关心的鸭子品种上(别太使劲关注,小心禽流感,“阿切!”)。
3、封装变化点,实现松耦合,这点不用多说了。
课程中提到,编码当中的设计模式使用不是我们在编程之初就定下来的,应该是重构得到设计模式(Refactoring to Patterns)。哦,原来是这样,也好理解。在编码中遇到问题,然后想想应对方式。哈哈,我原来认为开始编程时就指定我们用什么设
您可能关注的文档
最近下载
- 职业技术学校电子商务专业人才培养调研报告.docx VIP
- 材料力学课堂教学(中文版)-范钦珊-材料力学-第2章.ppt VIP
- 售后服务承诺书范文(精选7篇).docx VIP
- 《AIGC应用实战:写作、绘图、视频制作、直播》课件 第六章 AI视频制作.pptx VIP
- 南充市阆中市小学数学二年级下学期数学期末试卷.doc VIP
- 中国国家标准 GB 16796-2022安全防范报警设备 安全要求和试验方法.pdf
- 《AIGC应用实战:写作、绘图、视频制作、直播》课件 第五章 Stable Diffusion的使用方法.pptx VIP
- 工程造价结算审计的方法和技巧.docx VIP
- 材料力学课堂教学(中文版)-范钦珊-第1章 基本概念.ppt VIP
- 学生奶采购配送服务方案(技术标).pdf
文档评论(0)