浅谈c#设计模式之单一原则

 更新时间:2021年9月22日 10:11  点击:1728

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

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

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

单一职责原则

例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类有两个原因引起变化,但是我们是面向接口编程,对外公布的是接口,而不是实现类。如果非要使得类符合单一职责原则,那么就要使用上一个类图了,但是这样的话类的耦合性就增加了.

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

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25