WebCast听课录(1)

简介:
课程名:C#面向对象设计模式纵横谈(1)面向对象设计模式与原则

设计模式简介
 
每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。
——Christopher Alexander
 
设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。
 
面向对象设计模式解决的是“类与相互通信的对象之间的组织关系,包括它们的角色、职责、协作方式几个方面。面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”是那些可以满足“应对变化,提高复用”的设计。
 
面向对象设计模式描述的是软件设计,因此它是独立于编程语言的,但是面向对象设计模式的最终实现仍然要使用面向对象编程语言来表达,各种面向对象编程语言相互有别,但都能看到它们对面向对象三大机制的支持,即:“封装、继承、多态”
– 封装,隐藏内部实现
– 继承,复用现有代码
–      多态,改写对象行为
 
使用面向对象编程语言(如C#),可以推动程序员以面向对象的思维来思考软件设计结构,从而强化面向对象的编程范式。.C# 是一门支持面向对象编程的优秀语言,包括:各种级别的封装支持;单实现继承+多接口实现;抽象方法与虚方法重写。
 
通过面向对象编程语言(OOPL)认识到的面向对象,并不是面向对象的全部,甚至只是浅陋的面向对象。OOPL的三大机制“封装、继承、多态” 可以表达面向对象的所有概念,但这三大机制本身并没有刻画出面向对象的核心精神。换言之,既可以用这三大机制做出“好的面向对象设计”,也可以用这三大机制做出“差的面向对象设计”。不是使用了面向对象的语言(例如C#),就实现了面向对象的设计与开发!因此我们不能依赖编程语言的面向对象机制,来掌握面向对象。
 
OOPL没有回答面向对象的根本性问题——我们为什么要使用面向对象?我们应该怎样使用三大机制来实现“好的面向对象”?我们应该遵循什么样的面向对象原则?单纯从编程语言上获得的面向对象知识,不能够胜任面向对象设计与开发。
 
示例
 
设计一个人事管理系统,其中的一个功能是对各种不同类型的员工,计算其当月的工资——不同类型的员工,拥有不同的薪金计算制度。
 
 
结构化做法
 
1。获得人事系统中所有可能的员工类型

2。根据不同的员工类型所对应的不同的薪金制度,计算其工资

enum EmployeeType{ 
Engineer; 
Sales; 
Manager; 
… 
// 计算工资程序
If ( type==EmployeeType.Engineer) { //按工程师的标准计算工资
…… 
else if (type== Employeetype.Sales) { //按销售人员的标准计算工资
…… 


面向对象设计
 
1。根据不同的员工类型设计不同的类,并使这些类继承自一个
Employee抽象类,其中有一个抽象方法GetSalary。
 
2。在各个不同的员工类中,根据自己的薪金制度,重写(override) GetSalary方法。

abstract class Employee
… … 
public abstract int GetSalary();

class Engineer: Employee
{
public override int GetSalary() 
}


class Sales: Employee
{
 public override int GetSalary() 
}
}


Employee e=  emFactory.GetEmployee(id); 

MessageBox.Show( e.GetSalary());


现在需求改变,随着客户公司业务规模的拓展,又出现了更多类型的员工,比如钟点
工、计件工……等等
 
结构化做法
 
几乎所有涉及到员工类型的地方(当然包括“计算工资程序”)都需要
做改变……这些代码都需要重新编译,重新部署…….
 
面向对象做法
 
只需要在新的文件里增添新的员工类,让其继承自Employee抽象类,并重写GetSalary()方法,然后在EmployeeFactory.GetEmployee 方法中根据相关条件,产生新的员工类型就可以了。其他地方(显示工资程序、Engineer类、Sales类等)则不需要做任何改变。
 
对于前面的例子,从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小。从微观层面来看,面向对象的方式更强调各个类的“责任”,新增员工类型不会影响原来员工类型的实现代码——这更符合真实的世界,也更能控制变化所影响的范围,
 
. 对象是什么?
– 从概念层面讲,对象是某种拥有责任的抽象。
– 从规格层面讲,对象是一系列可以被其他对象使用的公共接口。
–      从语言实现层面来看,对象封装了代码和数据。
–       
.怎样才能设计“好的面向对象”?
– 遵循一定的面向对象设计原则
– 熟悉一些典型的面向对象设计模式
 
从设计原则到设计模式
 
. 针对接口编程,而不是针对实现编程
– 客户无需知道所使用对象的特定类型,只需要知道对象拥有客户所期望的接口。



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/10/11/525801.html,如需转载请自行联系原作者
目录
相关文章
|
存储 关系型数据库 MySQL
MySQL中的回表
MySQL中的回表
|
运维 Cloud Native 云计算
云端新篇章:云原生技术的崛起与影响
本文旨在深入探讨云原生技术的概念、特点及其在现代信息技术领域中的应用和影响。通过对云原生技术的详细解析,本文将揭示这一新兴技术如何推动企业数字化转型,以及它对未来软件开发、部署和运维模式的潜在变革。不同于传统的云计算模式,云原生技术以其独特的优势,正在重塑IT行业的格局。
273 7
|
安全 Java 应用服务中间件
Tomcat弱口令+后端getshell漏洞
Tomcat弱口令+后端getshell漏洞
258 6
|
9月前
|
人工智能 弹性计算 运维
OS Copilot评测报告
本文测评OS Copilot在云资源运维管理中的表现,基于阿里云ECS环境。该工具通过-t、-f和管道功能,将AI集成到运维场景中,简化了部分工作流程并提升了效率。特别是-t参数能自动执行命令并生成报告,但存在推理过程不透明、命令执行无记录等安全隐患。此外,文档对新手不够友好,复杂任务执行缺乏明确指引,输出结果冗长且不直观,影响用户体验。整体而言,虽有创新但需进一步优化以提升安全性和易用性。
204 22
|
10月前
|
人工智能 自然语言处理 前端开发
CodeArena:在线 LLM 编程竞技场!用于测试不同开源 LLM 的编程能力,实时更新排行榜
CodeArena 是一个在线平台,用于测试和比较不同大型语言模型(LLM)的编程能力。通过实时显示多个 LLM 的代码生成过程和结果,帮助开发者选择适合的 LLM,并推动 LLM 技术的发展。
231 7
CodeArena:在线 LLM 编程竞技场!用于测试不同开源 LLM 的编程能力,实时更新排行榜
|
10月前
|
机器学习/深度学习 人工智能 调度
高效评估多模态预训练对齐质量,中科大提出模态融合率MIR
中国科学技术大学研究团队提出了一种新的评估指标——模态融合率(MIR),用于评估多模态预训练模型的对齐质量。MIR通过衡量不同模态之间的分布距离,有效反映了模型的对齐质量,并在多种训练配置下表现出良好的鲁棒性和通用性。实验结果表明,MIR能够准确评估训练数据选择、训练策略调度和模型架构设计对预训练结果的影响,为多模态学习提供了可靠的方法。
329 22
|
11月前
|
敏捷开发 数据可视化 API
6款高效的任务看板管理工具,哪款能提升团队协作效率
本文对比了六款流行的任务看板管理工具:板栗看板、Trello、Asana、Monday.com、ClickUp 和 Jira。从功能、易用性、价格等方面进行了详细分析,帮助用户根据团队规模、项目复杂度及预算选择最适合的任务管理工具。
6款高效的任务看板管理工具,哪款能提升团队协作效率
|
机器学习/深度学习 算法 流计算
TPAMI 2024:ProCo: 无限contrastive pairs的长尾对比学习
【8月更文挑战第17天】在深度学习领域,长尾分布问题困扰着视觉识别任务。针对监督对比学习(SCL)在长尾数据中受限于批量大小的问题,清华大学的研究者在TPAMI 2024发表了一种概率对比学习方法ProCo。ProCo通过估计特征空间中的样本分布,允许在小批量数据中高效构建对比对,采用vMF混合模型简化分布估计,实现无限对比对的采样和封闭形式的对比损失,有效解决了SCL的固有问题。此方法不仅提升了长尾类别的识别精度,还适用于半监督学习场景。尽管存在假设限制和超参数调整需求,ProCo在多种任务和数据集上展示了显著的性能提升。
437 60
|
安全 网络安全 数据安全/隐私保护
怎样才能有效提高网络安全意识?
【8月更文挑战第15天】
504 2
|
JavaScript 前端开发 测试技术
Angular 与 Node.js 无缝对接简直太牛啦!前后端分离最佳实践,开启高效开发新时代!
【8月更文挑战第31天】随着互联网技术的发展,前后端分离模式日益受到开发者青睐。本文综述了 Angular 与 Node.js 的优势及无缝对接技术,探讨了前后端分离的最佳实践。Angular 以其组件化开发、双向数据绑定等特性成为优秀的前端框架;Node.js 则依靠高并发处理能力和全栈 JavaScript 开发的优势在后端大放异彩。两者结合通过 HTTP 请求实现高效通信,并可通过数据库实现数据共享。此外,文章还强调了接口设计、代码分离、测试及部署等方面的最佳实践,为开发者提供了全面的指导。
429 0