设计模式在软件应用尤其是互联网应用中随处可见,那些优秀的开源框架大量的使用了设计模式中的思想建立模型,老四依然为设计模式挖坑,今天浅析一下设计模式中涉及到的面向对象基本原则,单一职责原则。一个字:管好自己比啥都强。
定义
单一职责原则(Single Responsibility Principle,简称 SRP):就一个类而言,应该仅有一个引起它变化的原因。或者说一个类应该只负责负责一个功能领域中的相应职责,不要多管闲事。
此原则的目的其实是避免耦合给项目带来的臃肿和复杂度。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭到意想不到的破坏。软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。当我们程序员发现你要带着多个目的去修改某个类的时候,那这个时候你已经违反了单一职责原则。
假设现在有一个统计网站入口的类,当前类最初设计的时候,此入口类包含 JDBC 的连接、存储访问用户、计算入口访问数量、图表展示四个方法,试想一下,在最初的类设计中,和入口相关的就两个方法,而 JDBC,的连接以及查找用户不应该有入口类来完成,这不仅造成了业务上的耦合性,而且代码难以复用,难道再写一个类的时候你还需要在写一遍 JDBC 的连接吗?
为了更直观的提现单一职责的内容,也考虑到随着系统的不断演进与壮大,很多工程师回不可忽略的「忘了初心」,老四提供一下不成熟的代码示例,请各位指点批评,代码实例与上述举例差不多,按照上述例子书写而得。
耦合设计的带有多职责的入口类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 |
package com.glorze.coulping; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; /** * 具有耦合性的入口统计类 * @ClassName GlorzeEnter * @author: glorze.com * @since: 2018年3月13日 下午11:42:05 */ public class GlorzeEnter { /** * 数据库连接地址 */ private String dburl = "jdbc:mysql://www.glorze.com:3306/db_rbps"; /** * 数据库用户名 */ private String dbUserName = "glorze.com"; /** * 数据库密码 */ private String dbPassword = "http://www.glorze.com"; /** * MySql数据库驱动 */ private String dbDriver = "com.mysql.jdbc.Driver"; /** * 获取jdbc连接 * @Title: getCon * @throws Exception * @return Connection * @author: 高老四博客 * @since: 2018年3月13日 下午10:24:59 */ public Connection getCon() throws Exception { Class.forName(dbDriver); Connection con = DriverManager.getConnection(dburl, dbUserName, dbPassword); return con; } /** * 关闭jdbc连接 * @Title: closeCon * @param con * @throws Exception * @return void * @author: 高老四博客 * @since: 2018年3月13日 下午10:25:20 */ public void closeCon(Connection con) throws Exception { if (con != null) { con.close(); } } /** * 存储访问用户 * @Title: saveUser * @return User * @author: 高老四博客 * @since: 2018年3月13日 下午10:37:23 */ public User saveUser() { User user = new User("glorze.com", "高老四博客", "123456", 26, 1); return user; } /** * 计算网站访问数量 * @Title: countUv * @return BigDecimal * @author: 高老四博客 * @since: 2018年3月13日 下午10:39:00 */ public BigDecimal countUv() { BigDecimal bd = new BigDecimal("8888"); return bd; } /** * 返回入口访问统计的图表页面 * @Title: showChart * @return String * @author: 高老四博客 * @since: 2018年3月13日 下午10:40:13 */ public String showChart() { return "glorze/enter/lineChar"; } public static void main(String[] args) { // 测试数据库连接 GlorzeEnter dbUtil = new GlorzeEnter(); try { dbUtil.getCon(); System.out.println("高老四博客-数据库连接成功!"); } catch (Exception e) { System.out.println("高老四博客-数据库连接失败!"); e.printStackTrace(); } GlorzeEnter ge = new GlorzeEnter(); // 测试存储用户信息 ge.saveUser(); // 测试计算入口访问数量 ge.countUv(); } } |
拆开分成单一职责的网站入口访问统计类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
package com.glorze.singleresponsibility; import java.math.BigDecimal; /** * 设计单一职责的网站入口统计类 * @ClassName GlorzeEnter * @author: glorze.com * @since: 2018年3月13日 下午11:42:05 */ public class GlorzeEnterSRP { /** * 计算网站访问数量 * @Title: countUv * @return BigDecimal * @author: 高老四博客 * @since: 2018年3月13日 下午10:39:00 */ public BigDecimal countUv() { BigDecimal bd = new BigDecimal("8888"); return bd; } /** * 返回入口访问统计的图表页面 * @Title: showChart * @return String * @author: 高老四博客 * @since: 2018年3月13日 下午10:40:13 */ public String showChart() { return "glorze/enter/lineChar"; } public static void main(String[] args) { GlorzeEnterSRP ge = new GlorzeEnterSRP(); // 测试计算入口访问数量 ge.countUv(); } } |
其余的方法也设计成单一职责原则的类,比如 jdbc 工具类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
package com.glorze.singleresponsibility; import java.sql.Connection; import java.sql.DriverManager; /** * jdbc工具类,单独设计出来以供复用 * @ClassName DbUtil * @author: glorze.com * @since: 2018年3月13日 下午11:44:55 */ public class DbUtil { /** * 数据库连接地址 */ private String dburl = "jdbc:mysql://www.glorze.com:3306/db_rbps"; /** * 数据库用户名 */ private String dbUserName = "glorze.com"; /** * 数据库密码 */ private String dbPassword = "http://www.glorze.com"; /** * MySql数据库驱动 */ private String dbDriver = "com.mysql.jdbc.Driver"; /** * 获取jdbc连接 * @Title: getCon * @throws Exception * @return Connection * @author: 高老四博客 * @since: 2018年3月13日 下午10:24:59 */ public Connection getCon() throws Exception{ Class.forName(dbDriver); Connection con=DriverManager.getConnection(dburl, dbUserName, dbPassword); return con; } /** * 关闭jdbc连接 * @Title: closeCon * @param con * @throws Exception * @return void * @author: 高老四博客 * @since: 2018年3月13日 下午10:25:20 */ public void closeCon(Connection con) throws Exception{ if(con!=null){ con.close(); } } public static void main(String[] args) { DbUtil dbUtil=new DbUtil(); try { dbUtil.getCon(); System.out.println("高老四博客-数据库连接成功!"); } catch (Exception e) { System.out.println("高老四博客-数据库连接失败!"); e.printStackTrace(); } } } |
项目完整下载地址文末自助下载。
更博不易,如果觉得文章对你有帮助并且有能力的老铁烦请捐赠盒烟钱,点我去赞助。或者扫描文章下面的微信/支付宝二维码打赏任意金额(点击「给你买杜蕾斯」),也可扫描小站放的支付宝领红包二维码,线下支付享受优惠的同时老四也可以获得对应赏金,老四这里抱拳谢谢诸位了。捐赠时请备注姓名或者昵称,因为您的署名会出现在赞赏列表页面,您的捐赠钱财也会被用于小站的服务器运维上面,再次抱拳感谢。
资源下载
隐藏内容:******,购买后可见!
下载价格:0 G币
您需要先登录后,才能购买资源
欢迎访问高老四博客(glorze.com),本站技术文章代码均为老四亲自编写或者借鉴整合,其余资源多为网络收集,如涉及版权问题请与站长联系。如非特殊说明,本站所有资源解压密码均为:glorze.com。