java设计模式1,单一职责原则

java设计模式1,单一职责原则单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

在这里插入图片描述

一、单一职责原则定义

单一职责原则(SRP:Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。该原则由罗伯特·C·马丁(Robert C. Martin)于《敏捷软件开发:原则、模式与实践》一书中给出的。马丁表示此原则是基于汤姆·狄马克(Tom DeMarco)和Meilir Page-Jones的著作中的内聚性原则发展出的。
所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。

二、模拟场景

通过订阅哪吒专栏的场景说明一下。

1、普通用户,一般只能查阅哪吒的普通文章,并通过超链的形式时刻提醒着它们,要购买哪吒的付费专栏,付费知识就是香。

2、专属用户,通过购买专栏的形式查阅单一专栏的优质文章,并时刻提醒着,要购买其它专栏啊,毕竟学习才是王道。

3、VIP用户(订阅了哪吒的全部专栏),既可以看《Java基础教程系列》,也可以看《Spring Boot 进阶实战》,无推广,告别CRUD,进阶高级Java工程师,升职加薪,迎娶白富美。

三、违背原则方案

下面根据需求场景直接编码,根据不同用户,判断阅读权限。

1、配置类

package com.guor.config;

public class AppConfig { 
   

    public static final String USER_GENERAL = "普通用户";
    public static final String USER_EXCLUSIVE = "专属用户";
    public static final String USER_VIP = "VIP用户";

}

Jetbrains全家桶1年46,售后保障稳定

2、逻辑代码

package com.guor.designprinciples;

import com.guor.config.AppConfig;

public class UserService { 
   
    public void readByType(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工程师,升职加薪,迎娶白富美");
        }
    }
}

这么简单,so seay!commit,提交,下班!

第二天,经理来找我,要增加一个需求,逢年过节的要给哪吒VIP发放福利,比如赠送精美图书,赠送精美周边等。

看起来也很简单,只要增加一个ifesle就完事了,不过,作为一个高级Java开发工程师,写了一堆ifelse,不会脸红吗?

3、测试类

public static void main(String[] args) { 
   
        UserService userService = new UserService();
        userService.readByType(AppConfig.USER_GENERAL);
        userService.readByType(AppConfig.USER_EXCLUSIVE);
        userService.readByType(AppConfig.USER_VIP);
    }

因为UserService中通过一个ifelse实现逻辑,所以调用的时候所有用户都通过一个方法实现,对于简单的或者不用再改变的功能来说,也还可以。如果再增加其它需求,每一次需求的实现都可能影响到其他逻辑,给整个接口服务带来不可控的风险,因为代码只要修改了,就应该测试一下,对吧!

四、单一职责原则改善代码

为了满足经理不但迭代的需求,不能使用一个类把所有的用户行为混为一谈,而是需要提供一个上层的接口类,对不同的用户给出单独的实现类,明确各自的职责边界,确定一个类的单一职责。

1、定义接口

定义要实现的功能,阅读文章、推广选择。

package com.guor.service;

public interface IUserService { 
   
    // 阅读文章
    void read();

    // 推广宣传
    void promote();
}

2、实现类,普通用户

package com.guor.service.impl;

import com.guor.service.IUserService;

/** * 普通用户 */
public class GeneralUserServiceImpl implements IUserService { 
   
    public void read() { 
   
        System.out.println("可以查阅哪吒的普通文章");
    }

    public void promote() { 
   
        System.out.println("并通过超链的形式时刻提醒着它们,要购买哪吒的付费专栏,付费知识就是香");
    }
}

3、实现类,专属用户

package com.guor.service.impl;

import com.guor.service.IUserService;

/** * 专属用户 */
public class ExclusiveUserServiceImpl implements IUserService { 
   
    public void read() { 
   
        System.out.println("通过购买专栏的形式查阅单一专栏的优质文章");
    }

    public void promote() { 
   
        System.out.println("并通过超链的形式时刻提醒着它们,购买哪吒的其它付费专栏,付费知识就是香");
    }
}

4、VIP用户

package com.guor.service.impl;

import com.guor.service.IUserService;

/** * VIP用户 */
public class VipUserServiceImpl implements IUserService { 
   
    public void read() { 
   
        System.out.println("脚踩风火轮,手拿乾坤圈,学习哪吒优质文章,我命由我不由天。");
    }

    public void promote() { 
   
        System.out.println("告别CRUD,进阶高级Java工程师,升职加薪,迎娶白富美");
    }
}

每种用户对应的阅读权限都有对应的实现类,不会相互干扰。当某一类用户需要添加新的权限或增加新的用户类别时,操作起来也非常方便。比如上文中提到的逢年过节的要给哪吒VIP发放福利,比如赠送精美图书,赠送精美周边等。

在这里插入图片描述
通过利用单一职责原则优化后,现在每个类只负责自己的用户行为,后续无论扩展新的功能还是增加用户种类,都可以很方便的开发和维护。
在项目开发的过程中,尽可能保证接口的定义、类的实现保持单一职责,对项目后期的迭代和维护会有很大的帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234107.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 设计模式——门面模式「建议收藏」

    设计模式——门面模式「建议收藏」今天我们继续来学习前面没有学完的结构型设计模式中的一种:门面模式。门面模式也是一种不太常用的设计模式。所以,我们今天依旧是了解为主,暂时不去深入的学习。概述门面模式:(FacadeDesignPattern)门面模式也叫外观模式,门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。门面模式原理和实现也比较简单,应用场景也比较明确,主要在接口设计方面使用。何时使用:解决易用性问题。解决性能问题。解决分布式事务问题。UML类图:角色组成:门面角色:客户端调用这个

  • [设计模式]委派模式「建议收藏」

    github地址:https://github.com/1711680493点我进入github如需了解更多设计模式,请进入我的设计模式专栏委派模式委派模式不是23设计模式中的一种.与策略模式很相似.拥有以下三种角色抽象任务角色 委派者角色 具体任务角色委派模式,就是将任务发给委派者角色,委派者角色去委派具体任务角色委派模式对外隐藏了具体实现,仅将委派者角色暴露给外部委派模式和策略模式不同的是,委派者角色和具体任务角色都要继承/实现抽象任务角色Spring框架很

  • 五、工厂模式—旅行的钱怎么来 #和设计模式一起旅行#

    君子爱财,取之有道!—— 出自《增广贤文》### 故事背景上一篇我和MM相约好了,去旅行了,但是旅行是需要Money的啊,作为有个搬砖的码农,没钱啊,怎么呢!不能穷游啊,真是愁人啊 !哎 ,办法总归困难多,这一篇就是写写如何通过工厂拿到钱,然后开始我们的旅行,为一路上能胡吃海喝打下基础!下面开始我们的造钱之旅!“` public class Client{publi…

  • 设计模式(二十一)状态模式

    设计模式(二十一)状态模式

  • ❤️设计模式肝完了,还挺全!腾讯和阿里的offer已拿!❤️

    ❤️设计模式肝完了,还挺全!腾讯和阿里的offer已拿!❤️设计模式肝完了,还挺全!腾讯和阿里的offer已拿!金九银十已经来了,挺近大厂最好的机会已经来了!如果你是要找工作的,一定要抓住这个机会!前面已经整理了很多的面试资料:1,❤️爆肝!整理了一周的Spring面试大全【含答案】,吊打Java面试官【建议收藏】!❤️2,❤️肝完了,一天掌握数据结构和算法面试题,吊打面试官,建议收藏❤️3,❤️集合很简单?开什么玩笑?肝了一周,全是精华,万字讲解!面试再不怕集合问题了!!!❤️4,肝完了,总结了SpringBoot与缓存的知识点,快速掌

  • 装饰设计模式

    装饰设计模式就是对已有的对象的功能进行增强简单小例子:我们考虑一下使用继承也可以对父类中的功能进行增强只需要调用super就可以调用父类的方法,那使用装饰和继承有什么区别?使用继承体系就会有点臃肿

    2021年12月22日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号