概要
所谓单一职责,一个类或接口应该只负责一种职责,当某个类或接口会因为两种职责的变更而引起变化时,我们就需要分割职责。
目的
一个类或接口应该只会因一种职责而发生改变
实例与效果
先看个例子吧。假设我们需要一个消息的接口类,可以设定发信者和消息内容,很容易我们会设计成这样一个接口以及实现的类,
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下,不知道而又不急的等我以后写了再看吧:)