設計模式之單一職責原則

對類來講,即一個類應用只負責一項職責,如類A負責兩個不一樣的職責:職責1,職責2.當職責1需求變動時,可形成職責2執行錯誤,因此須要將類A的粒度分解爲A1,A2.java

  • 下降類的複雜度,一個類只負責一項職責
  • 提升類的可讀性,可維護性
  • 下降變動引發的風險
  • 一般狀況下,咱們應該遵照單一職責原則,只在邏輯足夠簡單,才能夠在代碼級別違反單一職責原則;只有類中方法數量足夠少時,能夠在方法級別保持單一職責原則便可
package www.perwrj.principle.SRP;
/**
 * 方案一:不遵照單一職責原則
 * @author wangruijie
 *
 */
public class SingleResponsibilityDemo1 {
	public static void main(String[] args) {
		Vehicle vehicle = new Vehicle();
		vehicle.run("汽車");
		vehicle.run("飛機");
		vehicle.run("潛艇");
		/*
		 * 汽車在跑
		   飛機在跑
		   潛艇在跑
		 */
	}
}
/**
 * 交通工具類
 * @author wangruijie
 *
 */
class Vehicle{
	/**
	 * run方法中,違反單一職責原則
	 * 解決方案很簡單,根據交通工具運行的方式不一樣,分解成不一樣的類便可
	 * @param vegicle
	 */
	public void run(String vegicle) {
		System.out.println(vegicle + "在跑");
	}
}
package www.perwrj.principle.SRP;
/**
 * 方案二:遵照了單一職責原則
 * 但這樣花銷很大,要將類分解,同時修改客戶端
 * 改進:直接修改Vehicle類
 * @author wangruijie
 *
 */
public class SingleResponsibilityDemo2 {
	public static void main(String[] args) {
		RoadVehicle roadVehicle = new RoadVehicle();
		roadVehicle.run("汽車");
		AirVehicle airVehicle = new AirVehicle();
		airVehicle.run("飛機");
		WaterVehicle waterVehicle = new WaterVehicle();
		waterVehicle.run("潛艇");
	}
}
/**
 * 地上跑的
 * @author wangruijie
 *
 */
class RoadVehicle{
	public void run(String vehicle) {
		// TODO Auto-generated method stub
		System.out.println(vehicle + "地上跑的");
	}
}
/**
 * 天上飛的
 * @author wangruijie
 *
 */
class AirVehicle{
	public void run(String vehicle) {
		// TODO Auto-generated method stub
		System.out.println(vehicle + "天上飛的");
	}
}
/**
 * 在水中跑
 * @author wangruijie
 *
 */
class WaterVehicle{
	public void run(String vehicle) {
		// TODO Auto-generated method stub
		System.out.println(vehicle + "在水中跑");
	}
}
package www.perwrj.principle.SRP;
/**
 * 方案三
 * 這種修改方法沒有對原來類作大的修改,只是增長了方法。
 * 沒有在類級別上遵照單一職責原則
 * 在方法級別上遵照單一職責原則
 * @author wangruijie
 *
 */
public class SingleResponsibilityDemo3 {
	public static void main(String[] args) {
		Vehicle2 vehicle2 = new Vehicle2();
		vehicle2.run("汽車");
		vehicle2.runAir("飛機");
		vehicle2.runWater("潛艇");
		
	}
}
/**
 * 交通工具類
 * @author wangruijie
 *
 */
class Vehicle2{
	/**
	 * 
	 * @param vegicle
	 */
	public void run(String vegicle) {
		System.out.println(vegicle + "在地上跑");
	}
	
	public void runAir(String vegicle) {
		System.out.println(vegicle + "在天上跑");
	}
	
	public void runWater(String vegicle) {
		System.out.println(vegicle + "在水裏跑");
	}
}
相關文章
相關標籤/搜索