每天一学设计模式(一、单一职责原则)

引言

本文参考以下这篇文章

https://blog.csdn.net/guorui_java/article/details/125947300

定义

单一职责原则(Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。

它规定一个类/函数/模块应该只有一个发生变化的原因

该原则由罗伯特·C·马丁(Robert C. Martin)于《敏捷软件开发:原则、模式与实践》一书中给出的。

马丁表示此原则是基于汤姆·狄马克(Tom DeMarco)和Meilir Page-Jones的著作中的内聚性原则发展出的。

所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。

反例

public class UserService {

    // 读文章
    public void read(String userType) {
        if(AppConfig.USER_GENERAL.equals(userType)) {

            System.out.println("可以查阅哪吒的普通文章");

        } else if(AppConfig.USER_EXCLUSIVE.equals(userType)) {

            System.out.println("可以查阅哪吒的Java基础教程系列文章");

        } else if(AppConfig.USER_VIP.equals(userType)) {

            System.out.println("可以查阅哪吒的全部优质文章,告别CRUD,进阶高级Java工程师,升职加薪,迎娶白富美");

        }
    }

    // 发福利
    public void sendPresents(String userType) {

        // 对VIP用户发福利
        if(AppConfig.USER_VIP.equals(userType)) {

            // TODO 发福利

        }
    }
}

正例

public interface IUserService {

    void read();

    void sendPresents();

}
public class GeneralUserServiceImpl implements IUserService {

    public void read() {
        // TODO
    }

    public void sendPresents() {
        // TODO
    }

}

个人总结

根据上面的代码进行分析:

用户可以是多种类型的,行为可以是多种类型的,因此应该是一种多对多的关系;

而上述代码在一个行为(read)中涉及到了多种用户类型(general | exclusive | vip)

即强制将一个行为和多种数据类型进行绑定,将多对多的关系表示为一对多的关系,是不合理的;

修改后的代码:

不同类型的用户可以各自定义不同种类的行为,仍然保持逻辑上的多对多的关系,是合理的;

如果添加用户类型,则只需要新建xxxUserServiceImpl实现IUserService接口即可

如果添加用户行为,则可以在IUserService中添加或者单独给某个用户添加某种行为即可

补充

如果有多个实现类的某个行为是一致的,可以通过抽象类来提取公共方法

public interface IUserService {

    void read();

    void sendPresents();

}
public abstract class UserServiceImpl implements IUserService{

    public void read() {
        System.out.println("这是公共的读");
    }

    public void sendPresents() {
        System.out.println("这是公共的发福利");
    }

}
public class GeneralUserServiceImpl extends UserServiceImpl {

    public void read() {
        System.out.println("这是自定义的读");
    }

    // 如果不重写这个方法,则使用抽象类的方法
    // public void sendPresents() {
    //   System.out.println("这是自定义的写");
    // }

}
public class MainApplication {

    public static void main(String[] args) {
        GeneralUserServiceImpl userService = new GeneralUserServiceImpl();
        userService.read();
        userService.sendPresents();
    }

}

参考文档

普通类和抽象类的区别_LIT-涛的博客-CSDN博客_抽象类和普通类的区别

什么时候使用接口,什么时候使用抽象类_seniorShen的博客-CSDN博客_什么时候用接口什么时候用抽象类

设计模式23模式介绍_哪 吒的博客-CSDN博客_设计模式

Java中多态的表现形式_想种胡杨的博客-CSDN博客

包的内聚性三原则、包的耦合性原则_qq_32806781的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值