Java 此方法属于值对象还是管理器
在电子商务应用程序中,下面是高级APIJava 此方法属于值对象还是管理器,java,atg,Java,Atg,在电子商务应用程序中,下面是高级API interface Order{ public List<PaymentGroup> getPaymentGroups(); } interface PaymentGroup{} class PaymentGroupImpl implements PaymentGroup{} class CreditCard extends PaymentGroupImpl{} class GiftCard extends PaymentGr
interface Order{
public List<PaymentGroup> getPaymentGroups();
}
interface PaymentGroup{}
class PaymentGroupImpl implements PaymentGroup{}
class CreditCard extends PaymentGroupImpl{}
class GiftCard extends PaymentGroupImpl{}
class OrderManager{ //Manager component used to manipulate Order}
2) 将这些移动到OrderManager
class OrderManager{
public List<GiftCard> getGiftCards(Order order){}
}
类订单管理器{
公共列表getGiftCards(顺序){}
}
我个人更喜欢2),只是好奇有什么理由选择1)而不是2)我有两个答案。一个是我称之为旧的Skool OOP,另一个我称之为新的Skool OOP 让我们先解决新的问题。这也改变了人们看待OOP的方式。添加hasGiftCard()等方法会导致在代码中添加条件逻辑/分支。它可能看起来像这样:
if (order.hasGiftCard()) {
//Do gift card stuff
} else {
//Do something else
}
最终这种代码变得脆弱。在大型应用程序上,许多开发人员将编写谓词方法。谓词方法断言某事并返回true或false。这些方法通常以“has”、“is”或“contains”开头。例如,isValid()、hasAddress()或containsFood()。还有更多的开发人员编写使用这些谓词方法的条件逻辑
为了避免所有这些条件逻辑,软件工程师改变了他们对面向对象的想法。他们不再使用谓词方法和条件逻辑,而是开始使用策略模式、访问者模式和依赖注入。您的问题域中的示例可能如下所示:
//Old Skool
if (this.hasCreditCard()) {
orderManager.processCreditCard(this.getCreditCards());
}
以下是解决相同问题的另一种方法:
//New Skool
for(PaymentItem each : getPaymentItems()){
each.process(this);
}
新的Skool方法解决了这个问题。将工作推给下级对象,而不是让订单和订单管理器负责繁重的工作。这些图案很光滑,因为:
- 恕我直言,您不需要PaymentGroup接口和PaymentGroupImpl类。如果所有的支付类都扩展了PaymentGroupImpl,那么就去掉这个接口,将PaymentGroup设为一个类
- 将isCreditCard()和isGiftCertificate()等方法添加到PaymentGroup类。让他们全部返回“false”
- 在PaymentGroup的子类中,在适当的地方重写这些方法以返回true。例如,在CreditCard类中,isCreditCard()应返回“true”
- 在Order类中,创建按类型筛选付款的方法。创建诸如getCreditCards()、getGiftCertificates()等方法。在传统的Java(没有lambdas或helper库)中,这些方法可能看起来像这样
要知道,如果您添加了一个新的支付组,则必须在旧的Skool范例中的许多地方添加代码。我认为这在很大程度上取决于API的结构。 boolean hasCreditCards() { return !getCreditCards().isEmpty(); } boolean hasCreditCards() { for(PaymentGroup each : getPaymentGroups()){ if(each.isCreditCard()) { return true; } return false; } }