Go最新单一职责原则——面向对象设计原则,技术协会Golang部面试

11 篇文章 0 订阅
10 篇文章 0 订阅

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

本节介绍如何使用单一职责原则解决问题。

例如,在 C语言中文网中,用户分为普通用户和VIP用户。普通用户不能阅读学习收费文章,VIP用户可以任意反复阅读,功能职责不一样。

首先创建用户类 User。

package net.biancheng.c.srp;
public class User {
    public void study(String userType) {
        if ("common".equals(userType)) {
            System.out.println("不能阅读收费文章");
        } else {
            System.out.println("可以任意反复阅读收费文章");
        }
    }
}

下面编写客户端测试代码,无论是普通用户还是VIP会员,都调用 study() 方法的逻辑。

public static void main(String[] args) {
    User user = new User();
    user.study("common");
    user.study("vip");
}

从上面代码看,User 类承担了两种处理逻辑。假如现在对用户进行加密,那么普通用户和VIP会员的加密逻辑是不一样的,必须修改代码。而修改代码逻辑势必会相互影响,容易带来不可控的风险。

下面我们对职责进行分离解耦,分别创建 CommonUser 和 VipUser。

CommonUser 类的代码如下。

package net.biancheng.c.srp;
public class CommonUser {
    public void study(String userType) {
        System.out.println(userType + "不能阅读收费文章");
    }
}

VipUser 类的代码如下。

package net.biancheng.c.srp;
public class VipUser {
    public void study(String userType) {
        System.out.println(userType + "任意阅读收费文章");
    }
}

客户端代码如下,将普通会员的处理逻辑调用 CommonUser 类,VIP 会员的处理逻辑调用 VipUser 类。

public static void main(String[] args) {
    CommonUser commonUser = new CommonUser();
    commonUser.study("common");
    VipUser vipUser = new VipUser();
    vipUser.study("vip");
}

对于教程方面,我们要对教程做权限。普通学员只能获得教程的基本信息,VIP 用户可以获得阅读权限。所以在控制教程层面,至少有两个职责,我们可以把展示职责和管理职责分离开,都实现同一个抽象依赖。

设计一个顶层接口 Course。

package net.biancheng.c.srp;
public interface Course {
    //获取教程的基本信息
    String getCourseTitle();
    //获得阅读权限
    byte[] getReadPow();
    //学习教程
    void studyCourse();
    //退款
    void refundCourse();
}

这里可以把 Course 接口拆分成两个接口,创建一个接口 CourseInfo 和 CourseManager。

CourseInfo 接口的代码如下。

package net.biancheng.c.srp;
public interface CourseInfo {
    //获取教程的基本信息
    String getCourseTitle();
    //获得阅读权限
    byte[] getReadPow();
}

CourseManager 接口的代码如下。

package net.biancheng.c.srp;
public interface CourseManager {
    //学习教程
    void studyCourse();
    //退款
    void refundCourse();
}

类图如下:

UML类图

下面来看方法层面的单一职责设计。有时候,我们通常会把一个方法写成下面这样。

private void modifyUserInfo(String userName, String url) {
    userName = "C语言中文网";


![img](https://img-blog.csdnimg.cn/img_convert/fac091cc7123042b60d0d82ddad1e127.png)
![img](https://img-blog.csdnimg.cn/img_convert/0fb47db05d2a9a5c92b75e01a7ad3cba.png)
![img](https://img-blog.csdnimg.cn/img_convert/09d0353cf27acc79a1887e2cebf9fa11.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值