倚楼听风雨
淡看江湖路

浅析设计模式第三章之单一职责原则

设计模式在软件应用尤其是互联网应用中随处可见,那些优秀的开源框架大量的使用了设计模式中的思想建立模型,老四依然为设计模式挖坑,今天浅析一下设计模式中涉及到的面向对象基本原则,单一职责原则。一个字:管好自己比啥都强。

定义

单一职责原则(Single Responsibility Principle,简称 SRP):就一个类而言,应该仅有一个引起它变化的原因。或者说一个类应该只负责负责一个功能领域中的相应职责,不要多管闲事。

此原则的目的其实是避免耦合给项目带来的臃肿和复杂度。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭到意想不到的破坏。软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。当我们程序员发现你要带着多个目的去修改某个类的时候,那这个时候你已经违反了单一职责原则。

假设现在有一个统计网站入口的类,当前类最初设计的时候,此入口类包含 JDBC 的连接、存储访问用户、计算入口访问数量、图表展示四个方法,试想一下,在最初的类设计中,和入口相关的就两个方法,而 JDBC,的连接以及查找用户不应该有入口类来完成,这不仅造成了业务上的耦合性,而且代码难以复用,难道再写一个类的时候你还需要在写一遍 JDBC 的连接吗?

为了更直观的提现单一职责的内容,也考虑到随着系统的不断演进与壮大,很多工程师回不可忽略的「忘了初心」,老四提供一下不成熟的代码示例,请各位指点批评,代码实例与上述举例差不多,按照上述例子书写而得。

耦合设计的带有多职责的入口类:

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();
		
	}

}

拆开分成单一职责的网站入口访问统计类:

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 工具类:

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。

赞(3) 给你买杜蕾斯
本站原创文章受自媒体平台原创保护,未经允许不得转载高老四博客 » 浅析设计模式第三章之单一职责原则
分享到: 更多 (0)

开始你的表演 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下老四,鼓励我更好的创作

支付宝扫一扫打赏

微信扫一扫打赏