设计原则之单一职责原则解析

单一职责原则 [Simple Responsibility Principle]

  • 定义:不要存在多于一个类导致接口变更的原因

  • 一个类、接口、方法只负责一项职责

  • 优点

    • 降低类的复杂度。实现职责有清晰的定义
    • 提高类的可读性。复杂性降低提高可读性
    • 提高系统的可维护性。可读性提高必然容易维护
    • 降低变更引起的风险。一个接口或者一个类的修改只对相关联的实现有影响、对其他的接口无影响。提高了系统的扩展性和可维护性

未按照单一职责原则设计的接口

  • IUser类
package com.example.simple_responsibility.old.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class IUser {
    private int id;
    private String username;
    private String password;
    private String sex;
    private Integer roleId;
}
  • IUserInfoService接口
package com.example.simple_responsibility.old.service;

public interface IUserInfoService {
    void setUserId(String userId);
    String getUserId();
    void setPassword(String password);
    String getPassword();
    void setUserName(String userName);
    String getUserName();
    boolean changePassword(String password);
    boolean deleteUser();
    boolean addRole(int roleId);
}

这里,大家可看一下IUserInfoService这个接口、想必很多朋友已经看出来了,这个接口不光有对业务对象,属性的操作,还有业务逻辑的方法。让接口看起来特别臃肿。如果这个时候不考虑设计原则的话,必会影响后期的维护、而且接口中的部分方法变更会导致对其他接口有影响,严重会导致线上问题。不符合单一设计原则

按照单一职责原则设计的接口

  • UserInfo类(等同IUser)
package com.example.simple_responsibility.newer.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
    private int id;
    private String username;
    private String password;
    private String sex;
    private Integer roleId;
}
  • IUserBizService(业务逻辑接口)
package com.example.simple_responsibility.newer.service;

/**
 * 业务逻辑
 */
public interface IUserBizService {
    boolean changePassword(String password);
    boolean deleteUserById(Integer userId);
    boolean addRole(int roleId);
}
  • IUserBOService(业务对象的抽象接口)
package com.example.simple_responsibility.newer.service;

/**
 * 业务对象
 */
public interface IUserBOService {
    void setUserId(String userId);
    String getUserId();
    void setPassword(String password);
    String getPassword();
    void setUserName(String userName);
    String getUserName();
}
  • UserInfoServiceImpl(实现了业务对象和业务逻辑接口)
package com.example.simple_responsibility.newer.service.impl;

import com.example.simple_responsibility.newer.service.IUserBOService;
import com.example.simple_responsibility.newer.service.IUserBizService;
import org.springframework.stereotype.Service;

@Service
public class UserInfoServiceImpl implements IUserBOService, IUserBizService {
    //省略实现...
}

按单一职责改造后,代码看起来是不是更整洁了、从原来的一个接口按职责划分成业务对象、属性接口以及业务逻辑接口。

对于接口,我们再设计的时候就要考虑职责划分,尽量做到单一。对于实现类如果硬要生搬硬套可能会导致类的剧增,影响维护。不要认为制造复杂性

这里给大家简单举个例子

张三在一个小区买了A、B两套房子。交房的时候售楼处给张三两把钥匙,一把是A房的、一把是B房的。
买完之后要装修,如果这个时候张三将两栋房子都统一成一把钥匙。这样平时带一把钥匙就可以开两套房的门。
这天,张三外出办事,不小心把钥匙弄丢了,这时候张三那个家都回不去了、只能让媳妇过来送钥匙。
不过因为之前换过,所以钥匙开不开房门,只能找开门的师傅过来开门,把钥匙和锁都换成原来的了。
这就是单一职责原则,一个钥匙开一把锁,万能钥匙除外(手动滑稽)。

不知道上边这个例子大家看懂了没有,单一职责原则可以简单理解为一把钥匙开一把锁。复用到项目接口中,就是一个接口只做一件事,而且一个接口的变更不会影响其他接口,互不影响。

方法级别单一

  • Method类示例
package com.example.simple_responsibility.newer.method;

import com.example.simple_responsibility.newer.domain.UserInfo;
import java.util.Map;

public class Method {
    public void modifyUserInfo(String username, String address) {
        username = "San";
        address = "Beijing";
    }
    public void modifyUserInfo(String username, String address, boolean bool) {
        //不建议
        if (bool) {
            username = "San";
        } else {
            address = "Shanghai";
        }
    }
    public void modifyUserInfo(Map map) {
        UserInfo username = (UserInfo) map.get("username");
        //。。。 不建议、维护困难
    }
    public void modifyUserInfo(String username, String... fileds) {
        username = "San";
        for (String filed : fileds) {
            //if 。。。不建议
        }
    }
    //以下建议使用
    public void modifyUserName(String username) {
        username = "San";
    }
    public void modifyUserAddress(String address) {
        address = "Shenzhen";
    }
}

方法级别的设计建议符合单一职责原则,特别一些老项目或者新入职公司的小伙伴,如果有用Map进行传参的接口抓紧更正过来吧!如果没有最新的接口文档或者老人告诉你,会影响后期维护效率的,可以将其改成DTO等对象传参。

好了,今天单一职责原则就简单介绍到这里。如有不足敬请批评指正。

代码已更新到github上、此处只做部分演示、让大家了解单一职责原则的思想

github地址https://github.com/Ronald-Fi/Spring-Cloud

B站地址https://space.bilibili.com/374066240

欢迎大家留言评论。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • 目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒...
    加油小杜阅读 717评论 0 1
  • 设计模式六大原则 设计模式六大原则(1):单一职责原则 定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类...
    viva158阅读 763评论 0 1
  • 转载标注声明:http://www.uml.org.cn/sjms/201211023.asp 目录:[设计模式六...
    Bloo_m阅读 704评论 0 7
  • 设计模式6大原则 转自:http://www.cnblogs.com/devinzhang/archive/201...
    犀利的小眼神阅读 427评论 0 1
  • 无人机与台湾电子签一起到 今天早上还在睡梦中呢, 就被一阵门铃给吵醒了, 刚想碎一句哪个神经病啊, 突然想到可能是...
    次心壹阅读 338评论 1 7