设计模式--6大原则--单一职责原则

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

单一职责原则(Single Responsibility Principle),简称SRP。


定义:


There should never be more than one reason for a class to change.


应该有且仅有一个原因引起类的变更。


 


有时候,开发人员设计接口的时候会有些问题,比如用户的属性和用户的行为被放在一个接口中声明。这就造成了业务对象和业务逻辑被放在了一起,这样就造成了这个接口有两种职责,接口职责不明确,按照SRP的定义就违背了接口的单一职责原则了。


下面是个例子:


package com.loulijun.chapter1;

 

public interface Itutu {

    //身高

    void setShengao(double height);

    double getShengao();

    //体重

    void setTizhong(double weight);

    double getTizhong();

    //吃饭

    boolean chiFan(boolean hungry);

    //上网

    boolean shangWang(boolean silly);

}

  上面的例子就存在这个问题,身高、体重属于业务对象,与之相应的方法主要负责用户的属性。而吃饭、上网是相应的业务逻辑,主要负责用户的行为。但是这就会给人一种不知道这个接口到底是做什么的感觉,职责不清晰,后期维护的时候也会造成各种各样的问题。


解决办法:单一职责原则,将这个接口分解成两个职责不同的接口即可


ItutuBO.java:负责tutu(涂涂,假如是个人名)的属性


package com.loulijun.chapter1;

 

/**

 * BO:Bussiness Object,业务对象

 * 负责用户的属性

 * @author Administrator

 *

 */

public interface ItutuBO {

    //身高

    void setShengao(double height);

    double getShengao();

    //体重

    void setTizhong(double weight);

    double getTizhong();

}

ItutuBL.java:负责涂涂的行为


package com.loulijun.chapter1;

/**

 * BL:Business Logic,业务逻辑

 * 负责用户的行为

 * @author Administrator

 *

 */

public interface ItutuBL {

    //吃饭

    boolean chiFan(boolean hungry);

    //上网

    boolean shangWang(boolean silly);

}

这样就实现了接口的单一职责。那么实现接口的时候,就需要有两个不同的类


TutuBO.java


package com.loulijun.chapter1;

 

public class TutuBO implements ItutuBO {

    private double height;

    private double weight;

    @Override

    public double getShengao() {        

        return height;

    }

 

    @Override

    public double getTizhong() {

        return weight;

    }

 

    @Override

    public void setShengao(double height) {

        this.height = height;

    }

 

    @Override

    public void setTizhong(double weight) {

        this.weight = weight;

    }

 

}

TutuBL.java


package com.loulijun.chapter1;

 

public class TutuBL implements ItutuBL {

 

    @Override

    public boolean chiFan(boolean hungry) {

        if(hungry)

        {

            System.out.println("去吃火锅...");

            return true;

        }

        return false;

    }

 

    @Override

    public boolean shangWang(boolean silly) {

        if(silly)

        {

            System.out.println("好无聊啊,上会网...");

            return true;

        }

        return false;

    }

 

}

这样就清晰了,当需要修改用户属性的时候只需要对ItutuBO这个接口来修改,只会影响到TutuBO这个类,不会影响其他类。


那么单一职责原则的意义何在呢?


1、降低类的复杂性,实现什么样的职责都有清晰的定义


2、提高可读性


3、提高可维护性


4、降低变更引起的风险,对系统扩展性和维护性很有帮助


 


但是、使用单一职责原则有一个问题,“职责”没有一个明确的划分标准,如果把职责划分的太细的话会导致接口和实现类的数量剧增,反而提高了复杂度,降低了代码的可维护性。所以使用这个职责的时候还要具体情况具体分析。建议就是接口一定要采用单一职责原则,实现类的设计上尽可能做到单一职责原则,最好是一个原因引起一个类的变化。


转载于:https://my.oschina.net/u/1409620/blog/293879

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

法国为何是伟大数学家的摇篮?

全世界只有3.14 % 的人关注了青少年数学之旅笛卡尔、韦达、帕斯卡、费马、拉格朗日、拉普拉斯、达朗贝尔、勒让德、蒙日、彭赛列、柯西、傅里叶、庞加莱、伽罗华、格罗藤迪克…… 这些令无数大学生“闻风丧胆”的数学家,基本上都诞生于十七至二十世纪的法国。解析几…

(转)WCF教程系列(1)-创建第一个WCF程序

作为微软技术.net 3.5的三大核心技术之一的WCF虽然没有WPF美丽的外观但是它却是我们开发分布式程序的利器但是目前关于WCF方面的资料相当稀少希望我的这一系列文章可以帮助大家尽快入门下面先介绍一下我的开发环境吧操作系统:windows vista business版本编译器&…

Java开发面试高频考点学习笔记(每日更新)

Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝2.接口和抽象类的区别3.java的内存是怎么分配的4.java中的泛型是什么?类型擦除是什么?5.Java中的反射是什么6.序列化与反序列化7.Object有哪些方法?8.JVM内存…

Python 基础篇:在Python中用if语句时被认为是false的数据

在Python中,以下值被视为假值(Falsy Values): False:布尔值假。None:表示空或缺失的值。0:整数零。0.0:浮点数零。:空字符串。[]:空列表。{}:空字…

03 Files

本章提要-----------------------------------------------组成 oracle 的 8 种主要文件(包括 instance 和 database)instance: parameter file, trace file, alert filedatabase: data file, temp file, control file, redo log file, password file简单概述:parameter file: …

TensorFlow发布全新版本,又会带来哪些变革?

全世界只有3.14 % 的人关注了青少年数学之旅经过几年的发展,深度学习方法摧枯拉朽般地超越了传统方法,成为人工智能领域最热门的技术。之后,谷歌、亚马逊、百度、Facebook 纷纷开源了自己的深度学习框架。而支撑AlphaGo的核心技术架构--Tenso…

码农身份得到正式认证

各位同行的兄弟姐妹们,我们的码农(新生代农民工)身份已经得到国家正式确认,程序员这个职业也正式并到农民工行列了。现在互联网大厂,大部分程序员都是在做着模式化开发工作,已经没有技术含量了,…

c# 类的基本知识,未完,待续

1.访问修饰符的使用,如果函数或者是成员变量被public修饰的话,那么可以在该class之外访问,如果是private的话是不能在这个类 之外来访问的,c#中默认的是使用private修饰符,但是作为一个良好的编程习惯的话,…

jquery 样式获取设置值_[JQuery] jQuery选择器ID、CLASS、标签获取对象值、属性、设置css样式...

jQuery是继prototype之后又一个优秀的Javascrīpt框架。它是轻量级的js库(压缩后只有21k) ,它兼容CSS3,还兼容各种浏览器 (IE 6.0, FF 1.5, Safari 2.0, Opera 9.0)。jQuery使用户能更方便地处理HTML documents、events、实现动画效果,并且方…

面试字节我被String类的问题给问死了!

“” 是怎么连接字符串的?(JDK1.7及以上) 总结: 使用 “” 连接字符串时,实际上是使用临时创建的StringBuilder对象来辅助完成的。 对于编译时常量,在编译后直接计算出字符串的值,而不会在运行…

Miniprofiler在普通net项目中的使用

MiniProfiler是一款针对.NET, Ruby, Go and Node.js的性能分析的轻量级程序。可以对一个页面本身,及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容,并可以显示数据库访问的SQL(支持EF、EF CodeFirst等…

11月22日北京.net俱乐部活动ppt下载以及11月19日微软西格玛IE8开发讲座ppt下载

11月22日北京.net俱乐部活动ppt下载以及11月19日微软西格玛IE8开发讲座ppt下载 请点击下面的连接下载[url]http://cid-b10793e754ad25f7.skydrive.live.com/browse.aspx/IE8Training[/url]里面有3个文件,内容包含了IE8课程的主要内容转载于:https://blog.51cto.com…

加州大学惊现神操作!物理教授用数学论文摆脱400美元交通罚单,却惨被网友大反转.........

全世界只有3.14 % 的人关注了青少年数学之旅“学好数理化,走遍天下都不怕。”这句从上个世纪八十年代流传下来的金句,至今仍然哺育着理工科的莘莘学子。为了让模友们更好的理解这句话,今天就让小天给你们涨涨姿势,见识一下什么是学…

VMware虚拟机VMDK 快照 数据恢复成功

VMware虚拟机VMDK 快照 数据恢复成功【故障描述】某影院使用的票管理系统安装在一台虚拟中,数据库采用的是Oracle9I,虚拟机在安装好后做了一次快照,期间又做过一次快照,在正常使用过程,虚拟突然崩溃,无法启动&#xff…

phppage类封装分页功能_php显示页码分页类的封装

本文实例为大家分享了php封装显示页码的分页类,供大家参考,具体内容如下一、代码conn.phpclass Mysql{public function __construct(){$this->connect();}public function connect(){$connmysql_pconnect(localhost,root,root) or die("Connect …

[转]两个经典的windbg调试案例,值得学习。

1. 调试Bug的神兵利器:通过WinDbg条件断点收集Log 原文地址:http://blogs.msdn.com/yizhang/archive/2009/03/30/bug-windbg-log.aspx 调试Bug的神兵利器:通过WinDbg条件断点收集Log 前段时间花了几天一直在用WinDbg调试一个比较棘手的Bug。…

设计模式之观察者

观察者模式介绍观察者又名事件订阅者、监听者。观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个“观察者”该对象的其他对象。通知目标:拥有一些值得关注的状态的对象。发布者:它要自身的状态改…

热姜水的神奇妙用

人们通常会在着凉以后,泡一壶姜茶来喝,来预防感冒,其实热姜水除了这个作用以外还有几大作用的。     醉酒 用热姜水代茶饮用,可消化体内酒精。脚臭 热姜水中加点盐和醋,浸泡双脚15分钟左右,脚臭便可消…

二面京东被问到Java 反射,我直呼好家伙,这我不是必过吗?

二面京东被问到Java 反射,我直呼好家伙,这我不是必过吗?用多久我会升职加薪、当上技术总监、迎娶漂亮学姐、走上人生巅峰!想想还有点小激动。 好了开始分享面试经历 说说你反射的理解 到底什么是反射呢??…

通用路由封装(GRE)×××配置

本人没有很好的文采,只能直接配置,有不懂的地方,后面可以联系我,在配置当中,我会尽量在配置命令后面加标注。1、在R1上配置相关的命令R1(config)#int fa0/0 ---进入以太网fa0/0接口--R1&#…