DesignPattern系列__01SingletonResponsibility

单一职责原则

单一职责原则:一个类应该只有一个原因引起改变,即一个类应该只负责一个业务逻辑。

问题由来:类T负责t1, t2两个职责,当因为t1j对类T修改的时候,可能导致类T出现问题而影响职责t2。
解决方案:遵循单一职责原则,将类T进行改写,确保一个类负责一个职责。
demo:

有一个类Animal,具有方法breath功能,一般的思路是这样子设计的:

class Animal {
    public void breathe(String animal) {
        System.out.println(animal + "呼吸空气");
    }

}

当你创建一个Animal实例后,就可以调用breathe方法了。

public class SingletonResponsibility {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.breathe("鸟类");
        animal.breathe("狮子");
        //逻辑错误:鱼类应该呼吸水
        animal.breathe("鱼类");
    }
}

我们发现,当调用breathe方法时,若是传入鱼类,输出结果不会发生变化。但是,这在逻辑上面是错误的。

改进思路1:在breathe方法中进行判断

通过判断,区别对待:若是鱼类,则输出“呼吸水”;其他的动物,输出“呼吸空气”;
这样做的好处是:能够爆出业务逻辑的正确;但是违反了单一职责原则:类Animal除了负责正常的业务罗杰,还需要进行类型判断。

class Animal1 {
    public void breathe(String animal) {
        // 改进: 在方法中对animal进行判断,如果是鱼类,则显示呼吸水
        // 弊端: 没有尊新单一职责原则,该方法除了需要执行正常的业务逻辑外,
        //      还需要对animal进行判断。
        if ("鱼类".equals(animal)) {
            System.out.println(animal + "呼吸水");
        } else {
            System.out.println(animal + "呼吸空气");
        }
    }
}

改进思路2:对类、方法进行拆分

为了保证遵循单一职责原则,我们可以将类、方法进行拆分,并且保证了也为逻辑的正确。

class Animal2 {
    // 改进: 新增一个呼吸水的方法,这种方式虽然在类级别违反了单一职责原则,
    //  但是在方法上遵循了。
    // 注意: 单一职责原则在实际使用中,指的是遵循单一的业务逻辑。
    public void breathe(String animal) {
        System.out.println(animal + "呼吸空气");
    }

    public void breatheWater(String animal) {
        System.out.println(animal + "呼吸水");
    }
}

单一职责的优点:

1.降低类的负责度,一个类只对一个业务逻辑负责;
2.提高项目的可读性,可维护性;
3.j降低项目变更的风险;

注意事项:

在项目中,我们应该尽量遵循单一职责原则,但是,当业务逻辑较简单时,可以违背。

原文地址:https://www.cnblogs.com/JackHou/p/11283895.html

时间: 2024-10-16 15:03:52

DesignPattern系列__01SingletonResponsibility的相关文章

设计模式系列(二)原型模式

在设计模式系列(一)单例模式 中详细介绍了单例设计模式,下面一起来看一下原型模式. 一.概述 原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的. 原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据. 二.深拷贝和浅拷贝 原型模式中的拷贝分为"浅拷贝"和"深拷贝": 浅拷贝: 对值类型的

关于《设计模式演练》系列文章结构的规范

设计模式的恰当使用可以使程序结构更灵活,易于复用和扩展.但是使用设计模式的同时会以损失性能和增加复杂度为代价.所以在使用之前要进行权衡. 为了使设计模式的学习印象深刻,更能理解应用场景与限制,将每篇文章结构规定为以下: 1.小故事: (我家有只猫叫张小C,这次就把他带到程序世界中成为各个角色,遇到各种事情,用设计模式解决之.想想都感觉有意思!) 2.存在的问题探讨: 3.解决问题的设计模式登场: 4.解决了什么,失去了什么: 5.具体应用场景(谈一谈可以应用的场景) 该系列代码存放在 https

【Windows10 IoT开发系列】配置篇

原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry Pi.MinnowBoard和Galileo平台上的核心版.本文重点针对Raspberry Pi平台的Windwos10 IoT配置做介绍. Windows 10 IoT Editions ​一:设置你的电脑. 注:​开发Windows10 IoT的电脑需要Visual Studio 2015.

【Windows10 IoT开发系列】PowerShell的相关配置

原文:[Windows10 IoT开发系列]PowerShell的相关配置 可使用 Windows PowerShell 远程配置和管理任何 Windows 10 IoT 核心版设备.PowerShell 是基于任务的命令行 Shell 和脚本语言,专为进行系统管理而设计. 1.​启动 PowerShell (PS) 会话 注:若要使用装有Windows10 IoT Core设备启动PS会话,首先需要在主机电脑与设备之间创建信任关系. ​启动 Windows IoT 核心版设备后,与该设备相连的

【Windows10 IoT开发系列】API 移植工具

原文:[Windows10 IoT开发系列]API 移植工具 Windows 10 IoT Core 中是否提供你的当前 Win32 应用程序或库所依赖的 API? 如果不提供,是否存在可使用的等效 API? 此工具可以为你回答这些问题,并协助你将你的当前 Win32 应用程序和库迁移到 Windows IoT Core. Windows 10 IoT 核心版 API 移植工具可在 ms-iot/iot-utilities github 存储库中找到.下载存储库 zip 并将 IoTAPIPor

【Windows10 IoT开发系列】“Hello,World!”指导

原文:[Windows10 IoT开发系列]"Hello,World!"指导 本文主要是介绍使用C#来开发一个可以运行在Raspberry Pi2上的一个基本项目. ​1.在启动Visual Studio 2015后,选择"文件"→"新建项目". ​在打开的"新建项目"对话框中,选择"通用". ​选择第一个项目"空白应用(通用Windows)" 新建项目 ​注:如果这是你创建的第一个项

【Windows10 IoT开发系列】开发人员模式设置

原文:[Windows10 IoT开发系列]开发人员模式设置  声明:本文转自微软Windows 开发人员中心(https://msdn.microsoft.com/library/windows/apps/xaml/dn706236.aspx),在此基础上进行删减和修改. ​对于要用于开发.安装或测试应用的设备,不再需要开发人员许可证.你只需从设备的设置中为这些任务启用设备一次.(仅限于运行Windows 10系统的设备) 使用开发人员功能 ​使用 Microsoft Visual Stud

【Windows10 IoT开发系列】Powershell命令行实用程序

原文:[Windows10 IoT开发系列]Powershell命令行实用程序 更新帐户密码: 强烈建议你更新默认的管理员帐户密码.若要更新帐户密码,你可以发出以下命令: net user Administrator [new password]​ (其中 [new password] 表示你选择的强密码). 创建本地用户帐户: 如果你想要授予其他人访问你的 Windows IoT Core 设备的权限,你可以通过在 net user [username] [password] /add​ 中键

时序图与状态图(Rose) - Windows XP经典软件系列

最近开始了自己高级数据结构之旅,在这次旅行中,我将持续把一些高级的数据结构从理论到编码都过一遍,同时通过博客形式分享出来,希望大家指出不足之处! 二叉排序树是一种动态排序的数据结构,支持插入.删除.查找等操作,且平均时间复杂度为O(log(N)),但是普通二叉排序树不能保证树退化为一颗分支的情况,此时最坏情况下的时间复杂度为O(N).此时,平衡二叉树的产生了.平衡二叉树是一种动态调整平衡的数据结构,但理想的平衡二叉树很难,于是人们使用AVL.红黑树.Treap.伸展树等来替代平衡二叉树,这些数据