Java中的单一责任原则

时间:2020-02-23 14:35:34  来源:igfitidea点击:

在本教程中,我们将在Java.it中了解单一责任原则是实体原则和最简单的设计原则之一。

单一责任原则决定了改变类的一个原因。
如果我们有一个以上的原因更改类,请根据函数将类重构为多个类。

我们将在一个简单的example的帮助下理解。
有人说你有客户程序如下。

package org.igi.theitroad;
 
import java.util.List;
 
public class Customer {
 
	String name;
	int age;
	long bill;
	List<Item> listsOfItems;
	
	Customer(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	
	//Calculate bill should not be responsibility of customer
	public long calculateBill(long tax)
	{
		for (Item item:listsOfItems) {
			bill+=item.getPrice();
		}
		bill+=tax;
                this.setBill(bill);
		return bill;
	}
	
	//Report generation should not be responsibility of customer
	public void generateReport(String reportType)
	{
		if(reportType.equalsIgnoreCase("CSV"))
		{
			System.out.println("Generate CSV report");
		}
		if(reportType.equalsIgnoreCase("XML"))
		{
			System.out.println("Generate XML report");
		}
		
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public int getAge() {
		return age;
	}
 
	public void setAge(int age) {
		this.age = age;
	}
 
	public long getBill() {
		return bill;
	}
 
	public void setBill(long bill) {
		this.bill = bill;
	}
 
	public List<Item> getListsOfItems() {
		return listsOfItems;
	}
 
	public void setListsOfItems(List<Item> listsOfItems) {
		this.listsOfItems = listsOfItems;
	}
	
}

你看到上面的程序有问题吗?
让'看看上面的上面的问题是什么。

  • 如果账单计算有任何变化,那么我们需要更改客户类。
  • 如果要添加一个要生成的报告类型,则需要更改客户类。

如果我们注意到,条例草案和报告生成的计算不应该是客户的责任,我们应该为这些函数创建不同的程序。

让我们现在看到重构程序。

package org.igi.theitroad;
 
import java.util.List;
 
public class Customer {
 
	String name;
	int age;
	long bill;
	List listsOfItems;
	
	Customer(String name,int age)
	{
		this.name=name;
		this.age=age;
	}
	
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public int getAge() {
		return age;
	}
 
	public void setAge(int age) {
		this.age = age;
	}
 
	public long getBill() {
		return bill;
	}
 
	public void setBill(long bill) {
		this.bill = bill;
	}
 
	public List getListsOfItems() {
		return listsOfItems;
	}
 
	public void setListsOfItems(List listsOfItems) {
		this.listsOfItems = listsOfItems;
	}	
}

创建一个名为Billcalculator的新类并将客户对象传递给它。
本类将负责计算客户账单

package org.igi.theitroad;
 
import java.util.List;
 
public class BillCalculator {
 
		public long calculateBill(Customer customer,long tax)
		{
			long bill=0;
			List listsOfItems=customer.getListsOfItems();
			for (Item item:listsOfItems) {
				bill+=item.getPrice();
			}
			bill+=tax;
			customer.setBill(bill);
			return bill;
		}
}

创建一个名为ReportGenerator并将客户对象传递给IT的新类。
本类将负责生成客户报告

package org.igi.theitroad;
 
public class ReportGenerator {
 
		public void generateReport(Customer customer,String reportType)
		{
			//Extract data from customer object and generate the report
			if(reportType.equalsIgnoreCase("CSV"))
			{
				System.out.println("Generate CSV report");
			}
			if(reportType.equalsIgnoreCase("XML"))
			{
				System.out.println("Generate XML report");
			}
			
		}
}

正如我们现在可以看到的,如果我们需要在账单计算中更改任何内容,我们不需要修改客户类,我们将在Billcalculator类中进行更改。
同样,如果要添加另一个报告类型,则需要在ReportGenerator类而不是客户类中进行更改。