1. 程式人生 > >設計模式—單一職責原則

設計模式—單一職責原則

1.單一職責原則是什麼?

       單一職責原則又被稱為單一功能原則,是面向物件的六大基本原則之一,簡單的說就是對一個類而言,應該有且只有一個變化的原因。一個類只有一個引起它變化的原因就是一個類只有一個職責。如果說一個類中的每個職責都是變化的一個軸線,如果這個類有一個以上的職責,這些職責就會耦合在一起,這樣的設計是脆弱的,當其中的一個職責發生變化時就會有可能影響其它的職責。另外,多個職責耦合在一起還會影響其複用性。

2.程式碼中具體實現

       有的時候在設計介面或者類的過程中會將物件的屬性和行為放在同一介面中宣告,這樣就造成了業務物件和業務邏輯被放在同一類中,這樣就造成了這個介面有兩種屬性和行為的兩種職責,這種情況就是介面職責不明確違背了單一職責原則。

package SingleResponsibilityPrinciple;

public implements person 
{	
	//身高屬性
	public void setHeight(double height);
	public double getHeight();
	//體重屬性
	public void setWeight(double weight);
	public double getWeight();
	//學習行為
	public boolean programming(boolean study);
	//娛樂行為
	public boolean playing(boolean game);
}
       上面的介面就存在這個問題,在介面中身高、體重屬於業務物件,因此所對應的方法主要負責的是使用者屬性。而學習和娛樂屬於業務邏輯,所對應的方法主要負責使用者行為,如果按上面的方式實現就會給別人一個這個介面的職責不清楚的感覺,由於職責不清楚對後期的維護也會帶來各種各樣的問題。

       這時可以遵循單一職責原則,將上面的介面改寫為一個負責屬性的介面和一個負責行為的介面即可。

       PersonAttribute介面負責屬性

package SingleResponsibilityPrinciple;

public implements PersonAttribute 
{
	//身高屬性
	public void setHeight(double height);
	public double getHeight();
	//體重屬性
	public void setWeight(double weight);
	public double getWeight();
}

       PersonBehavior介面負責行為

package SingleResponsibilityPrinciple;

public implements PersonBehavior 
{
	//學習行為
	public boolean programming(boolean study);
	//娛樂行為
	public boolean playing(boolean game);
}
這樣就實現了介面的單一職責,那麼在實現的過程中就要使用兩個類分別去實現這兩個介面
package SingleResponsibilityPrinciple;

public class Tom implements PersonAttribute 
{
	private double height;
	private double weight;
	
	public void setHeight(double height) 
	{
		this.height = height;
	}

	public double getHeight() 
	{
		return height;
	}

	public void setWeight(double weight) 
	{
		this.weight = weight;
	}

	public double getWeight() 
	{
		return weight;
	}
		
}


package SingleResponsibilityPrinciple;

public class Allen implements PersonBehavior 
{
	
	public boolean programming(boolean study) 
	{
		if(study)
		{
			System.out.println("該學習了,快去程式設計......");
			return true;
		}
		else
		{
			return false;
		}
	}

	public boolean playing(boolean game) 
	{
		if(game)
		{
			System.out.println("該休息了,快去玩耍......");
			return true;
		}
		else
		{
			return false;
		}
	}
}
       通過這樣改寫以後每個介面的職責就清晰多了,當需求有變化時只要針對不同的職責去修改相對應的介面,同時只會影響到實現修改介面的那個類,而不會影響到其它的類,這樣就降低了耦合性。

3.總結

在進行設計的過程中遵循單一職責原則帶來的好處有:

  1. 降低類的複雜性,實現什麼樣的職責都有清晰的定義
  2. 降低需求變更帶來的風險,增強程式的可擴充套件性
  3. 提高程式碼的可閱讀性
  4. 提高程式碼的可維護性
       但是,單一職責原則雖然有很多的好處,在我們使用的過程中也不能過度使用,因為“職責”是相對的概念並沒有一個明確的劃分,如果在程式設計的過程中把職責劃分的太細的話就會導致介面和實現類的數量劇增,反而提高了複雜性、降低了程式碼的可閱讀性和可維護性,所以在使用這個原則在劃分職責的過程中還需要具體問題具體分析。

       以上Demo的原始碼地址:點選開啟連結