加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

【设计模式攻略】OO设计原则之SRP-单一职责原则

发布时间:2020-12-13 20:05:51 所属栏目:百科 来源:网络整理
导读:概要 所谓单一职责,一个类或接口应该只负责一种职责,当某个类或接口会因为两种职责的变更而引起变化时,我们就需要分割职责。 目的 一个类或接口应该只会因一种职责而发生改变 实例与效果 先看个例子吧。假设我们需要一个消息的接口类,可以设定发信者和消
概要
所谓单一职责,一个类或接口应该只负责一种职责,当某个类或接口会因为两种职责的变更而引起变化时,我们就需要分割职责。

目的
一个类或接口应该只会因一种职责而发生改变

实例与效果
先看个例子吧。假设我们需要一个消息的接口类,可以设定发信者和消息内容,很容易我们会设计成这样一个接口以及实现的类,
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下,不知道而又不急的等我以后写了再看吧:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读