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

本文共 1116 字,大约阅读时间需要 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下,不知道而又不急的等我以后写了再看吧:)

转载地址:http://vdeqj.baihongyu.com/

你可能感兴趣的文章
G:处女座和小姐姐(三)(思维)
查看>>
求最短路径的四种方法(Dijkstra,Floyd,Bellman-Ford,SPFA算法)
查看>>
处女座的比赛资格(拓扑排序求最短路)
查看>>
牛客寒假算法基础集训营4 I:Applese 的回文串(思维)
查看>>
牛客寒假算法基础集训营4 E:Applese 涂颜色(费马小定理+快速幂)
查看>>
牛客寒假算法基础集训营4 C:Applese 走迷宫(bfs)
查看>>
牛客寒假算法基础集训营4 F:Applese 的QQ群(拓扑排序判环)
查看>>
牛客寒假算法基础集训营4 G:Applese 的毒气炸弹(Kruskal求最小生成树)
查看>>
Codeforces Round #536 (Div. 2) B. Lunar New Year and Food Ordering(思维)
查看>>
Codeforces Round #536 (Div. 2) D. Lunar New Year and a Wander(基础图论)
查看>>
牛客寒假算法基础集训营6 A:出题(思维)+B:煤气灶(二分)+C:项链(简单贪心)+D:美食(模拟)
查看>>
牛客寒假算法基础集训营6 E:海啸(二维树状数组 or 前缀和 +容斥定理)
查看>>
G:区间或和(思维)
查看>>
牛客寒假算法基础集训营6 I:wzoi(stack的应用)
查看>>
牛客寒假算法基础集训营5 A:炫酷双截棍+G:炫酷数字(唯一分解定理+埃式筛法)+J:炫酷数学(快速幂)
查看>>
牛客寒假算法基础集训营5 I:炫酷镜子(模拟 or 记忆化搜索)+D:炫酷路途(贪心求最短路)
查看>>
C:小a与星际探索(线性基 or 搜索bfs or 背包dp)
查看>>
牛客寒假算法基础集训营1 D:小a与黄金街道(欧拉函数+快速幂)+G:小a的排列(思维)
查看>>
学习使我快乐学习使我升华只要你爱学习我们就是一辈子的好朋友
查看>>
牛客寒假算法基础集训营2 A:处女座的签到题(排序)+C:处女座的砝码(思维)+J:处女座的期末复习(贪心)
查看>>