浅谈c#设计模式之单一原则_实用技巧

单一原则: 程序设计时功能模块独立,功能单一更有助于维护和复用。

例如:个人计算机功能很多,如果想从中只拿出一个功能来制造一个新的东西是困难的。同时如果你的计算机开不机,同时你的计算器功能也不能用了。

在编程中如果一个类封装了太多功能和上面的结果是类似的。

单一职责原则

例1:

大家应该能看出来这个类图中的接口设计是有问题的,用户的属性和用户的行为没有分开。我们根据用户的属性和行为拆开这个接口。

重新拆分成两个接口,IUserBo 负责用户的属性,IUserBiz负责用户的行为。当我们实例化除UserINfo这个对象后,我们可以把UserInfo当做IUserBo实现类使用也可以将它当做IUserBiz的实现类使用,这就要看我们用在什么地方了。如果是获取用户信息,就把UserInfo 当做IUserBOSS的实现类,如果是维护用户信息,就当做是IUserBiz的实现类。在实际应用中我们更倾向于把一个接口拆分成两个,一个是IUserBO一个是IUserBIz。类图如下。

这样做以后,我们就把一个接口拆成了两个,这样就符合了单一职责原则,那么什么是单一职责原则呢?

单一职责原则,核心思想是:一个类,最好只做一件事,只有一个引起它变化的原因。

单一职责原则可以看作是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起变化的原因就越多,这将是导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责通常意味着单一的功能,因此不要为类实现过多的功能点,以保证实体只有一个引起它变化的原因。例2:

Rectangle拥有两个方法,一个方法是draw,用来画图形,另一个方法是area用来计算面积。Rectangle违背了单一职责原则,因为它具有两个职责:计算面积与绘制矩形。绘制图形会与用户界面有关,但是计算图形面积却未必与界面有关,如果把这两个职责写到一个类中,那么如果只需要使用area()方法这一职责来计算面积,那就不得不把draw()方法一同编译,但是却可能也用不到它。如果其中一个职责需要修改,就不得不重新编译和部署另外一个。如果类的职责超过一个,这些职责之间就会产生耦合。改变一个职责,可能会影响和妨碍类为其它类服务的功能。把两个职责分开会好一些。

两个职责分离,这样耦合度就会降低。SRP原则的核心就是要求对类的改变只能是一个,对于违反这一原则的类应该进行重构,例如以Façade模式或Proxy模式分离职责,通过基本的方法Extract Interface、Extract Class和Extract Method进行梳理。

例3:看一下下面的接口

    public interface Phone    {        //拨通电话        public void dial(string phoneNumber);        //通话        public void chat(object o);        //回应        public void answer(object o);        //通话完毕        public void huangup();    }

这个接口有问题吗?还真有问题。单一职责要求一个接口或者类只有一个原因引起变化,也就是一个接口或者类只有一个职责,它负责一件事情。Phone这个接口不是一个职责,它是有两个职责:一个是协议管理,一个是数据传输。diag()和huangup()这两个方法实现的是协议管理,拨号和挂断。chat()和answer()是数据传输。协议改变和数据传输都会引起类的变化,那么我们就不能说它是符合单一职责原则。由于这两个职责变化不互相影响,那么就考虑拆成两个接口。

这个类图已经符合单一职责原则,但是却复杂多了,组合是一种强耦合关系,两者都有共同的生命期,这种强耦合增加了类的复杂性,我们修改一下。

这样设计才完美,一个手机实现两个接口,把两个职责融合一个类中,虽然你会觉得这个phone类有两个原因引起变化,但是我们是面向接口编程,对外公布的是接口,而不是实现类。如果非要使得类符合单一职责原则,那么就要使用上一个类图了,但是这样的话类的耦合性就增加了.

单一职责原则的好处:类的复杂性降低可读性提高可维护性提高变更引起的风险降低

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c#
, 设计模式
单一原则
浅谈艺术作品的分类、浅谈党性修养、浅谈信息化战争、浅谈小班化教学的优势、浅谈 英文,以便于您获取更多的相关知识。

时间: 2025-01-31 05:24:41

浅谈c#设计模式之单一原则_实用技巧的相关文章

浅谈VS中的DataPager分页_实用技巧

微软的DataPager分页功能很强大,不要设置数据库存储过程,只要添加个DataPager控件,关联下要分页的控件,简单设置就可以有不错的分页效果.当然要有更理想的效果还是要前台和后台处理下. winform下的DataPager 显示模式: webForm下的样式由TemplatePagerField,NextPreviousPagerField和NumericPagerField控制 通过设置上面几个控件的配合也可以达到winForm下的效果,这3个控件中最重要的是TemplatePage

浅谈.Net并行计算之数据并行_实用技巧

从第一台计算机问世到现在计算机硬件技术已经有了很大的发展.不管是现在个人使用的PC还是公司使用的服务器.双核,四核,八核的CPU已经非常常见.这样我们可以将我们程序分摊到多个计算机CPU中去计算,在过去并行化需要线程的低级操作,难度很大,在.net4.0中的增强了对并行化的支持,使得这一切变得非常简单 .本次我从以下几个方面大家讲以下.NET 并行 1.      数据并行2.      任务并行3.      并行Linq4.      任务工厂5.      注意事项       本次主要给

浅谈对Lambda表达式的理解_实用技巧

在.NET 1.0的时候,大家都知道我们经常用到的是委托.有了委托呢,我们就可以像传递变量一样的传递方法.在一定程序上来讲,委托是一种强类型的托管的方法指 针,曾经也一时被我们用的那叫一个广泛呀,但是总的来说委托使用起来还是有一些繁琐.来看看使用一个委托一共要以下几个步骤: 用delegate关键字创建一个委托,包括声明返回值和参数类型 使用的地方接收这个委托 创建这个委托的实例并指定一个返回值和参数类型匹配的方法传递过去 好啦,我承认啦上面是自己在网上看到的,但是它很好的介绍了委托,在以前要使

C# 自定义异常总结及严格遵循几个原则_实用技巧

在C#中所有的异常类型都继承自System.Exception,也就是说,System.Exception是所有异常类的基类. 总起来说,其派生类分为两种: 1. SystemException类: 所有的CLR提供的异常类型都是由SystemException派生. 2. ApplicationException类: 由用户程序引发,用于派生自定义的异常类型,一般不直接进行实例化. 创建自定义异常类应严格遵循几个原则 1. 声明可序列化(用于进行系列化,当然如果你不需要序列化.那么可以不声明为

.NET Web开发之.NET MVC框架介绍_实用技巧

MVC概念 MVC是一种架构设计模式,该模式主要应用于图形化用户界面(GUI)应用程序.那么什么是MVC?MVC由三部分组成:Model(模型).View(视图)及Controller(控制器). Model即应用程序的数据模型.任何应用程序都离不开数据,数据可以存储在数据库中.磁盘文件中,甚至内存中.Model就是对这些数据的抽象,不论数据采取何种存储形式,应用程序总是能够通过Model来对数据进行操作,而不必关心数据的存储形式.数据实体类就是常用的一种Model.例如,一个客户管理应用程序使

Win 2000下ASP.NET开发环境的配置_实用技巧

Win 2000下ASP.NET的配置 Win 2000(包括Professional,Server和Advanced Server)在默认情况下是不支持ASP.NET的.必须对它进行一个环境的配置. 客户端 SQL Server .NET 数据提供程序 Microsoft 数据访问组件 (MDAC) 2.6 或更高版本 对系统管理信息的访问 Windows Management Instrumentation (WMI)(在 Windows 2000操作系统一起安装)COM+ 服务 Windo

asp.net下计算数字1至10的总和_实用技巧

复制代码 代码如下: protected void Page_Load(object sender, EventArgs e) { Response.Write(string.Format("数字1~10总和等于{0}.", Sum(1, 10).ToString())); } private int Sum(int min, int max) { int s = 0; for (int i = min; i <= max; i++) { s += i; } return s;

Asp.Net Couchbase Memcached图文安装调用开发_实用技巧

安装服务端 服务端下载地址:http://www.couchbase.com/download 选择适合自己的进行下载安装就可以了,我这里选择的是Win7 64. 在安装服务端如果发生如下所示的错误,我在win7 64安装的过程中就遇到了. 这个时候可以先撤销安装.通过CMD命令运行regedit.展开HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows\ CurrentVersion分支,在窗口的右侧区域找到名为"ProgramFilesDir"

如何轻松搭建Windows8云平台的开发环境_实用技巧

准备工作 在搭建环境前,大家需要在Windows Azure平台注册免费账号,注册完成后,即可获得90天免费使用权限.注册方法请参考:免费试用Windows Azure云平台(无须提供信用卡) 如果你具有微软MSDN Subscription账户,可以根据账户权限申请为期一年的Windows Azure账号.   开发环境_实用技巧-windows实用技巧">   具有Windows Azure账号后,请检查本地机器是否安装了远程桌面应用(Remote Desktop),在随后的文章中,将