博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式系列】OO设计原则之SRP-单一职责原则
阅读量:7067 次
发布时间:2019-06-28

本文共 1184 字,大约阅读时间需要 3 分钟。

概要
所谓单一职责,一个类或接口应该只负责一种职责,当某个类或接口会因为两种职责的变更而引起变化时,我们就需要分割职责。
目的
一个类或接口应该只会因一种职责而发生改变
实例与效果
先看个例子吧。假设我们需要一个消息的接口类,可以设定发信者和消息内容,很容易我们会设计成这样一个接口以及实现的类,
class IMessage {public:     virtual void SetSenderType(string sender) = 0;     virtual void SetMsgContent(string msg) = 0;};class Message :public IMessage{public:     virtual void SetSenderType(string sender);     virtual void SetMsgContent(string msg);};
初看似乎没有任何问题,扩展下思维再考虑下吧,如果message的格式有很多种,比如XML,HTML,JSON,你怎么办,或许分别继承实现三种Message类是个选择,但是每种实现里都包含着相同的SetSenderType实现,感觉到别扭吗?(或许你觉得冗余一个方法没事,那万一是10个呢?)如果我们要保持一个Message,那么就必须分割清楚职责,保证彼此间没有耦合而影响扩展。所以我们可以考虑加一个接口类,来提高扩展性。这样即使你对消息内容有任何扩展,对Message类本身都不会再有任何影响了。如下所示:
class IContent {public:     virtual void getContent() = 0;};class IMessage {public:     virtual void SetSenderType(string sender) = 0;     virtual void SetMsgContent(IContent content) = 0;};class Message :public IMessage{public:     virtual void SetSenderType(string sender);     virtual void SetMsgContent(IContent msg);};
应用
也许有这种情况,有人会问,我们的接口定义已经耦合的跟钢筋混凝土般结实了,怎么办?那么扩展功能之前,考虑重构吧,FACADE和PROXY模式或许可以帮到你。关于FACADE和PROXY,不知道而又心急的可以google下,不知道而又不急的等我以后写了再看吧:)

转载于:https://www.cnblogs.com/secbook/archive/2012/03/30/2655132.html

你可能感兴趣的文章
paper
查看>>
sql*loader的直接加载方式和传统加载方式的性能差异
查看>>
android ListView点击item返回后listview滚动位置
查看>>
DevExpress XtraTreeList TreeList复选框选择
查看>>
CF Polycarpus' Dice (数学)
查看>>
Eclipse用法与技巧——导入工程时报错(already exist in the workspace)
查看>>
python面向对象
查看>>
洛谷P1067 多项式输出
查看>>
考研随笔1
查看>>
机器学习算法学习---关联分析算法(二)
查看>>
selenium_webdriver(python)的第一个脚本
查看>>
第九周总结--助教
查看>>
meta标签
查看>>
关于样式获取的小细节--屏蔽单位及计算样式
查看>>
fetch方法
查看>>
vs2013 boost signals
查看>>
【cpp】new delete
查看>>
ruby 数据类型Symbol
查看>>
12月11日学习内容整理:ORM中的基于双下划线的跨表查询,反向查询,聚合和分组...
查看>>
让浮动子元素超过父元素宽度的方法
查看>>