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类而不是客户类中进行更改。