当前位置: 首页 > news >正文

西安哪家网站做的好大连网站建设外贸

西安哪家网站做的好,大连网站建设外贸,家装设计网站怎么做,汕头个人网站建设策略模式应用场景和uml在最近的博客中#xff0c;我收到了Wojciech Soczy#xff1f;ski的评论#xff0c;内容涉及在使用“不要问”#xff08;TDA#xff09;时如何使用“战略”模式实施单一责任原则#xff08;SRP#xff09;。 在某些时候#xff0c;我打算进一步讨… 策略模式应用场景和uml 在最近的博客中我收到了Wojciech Soczyski的评论内容涉及在使用“不要问”TDA时如何使用“战略”模式实施单一责任原则SRP。 在某些时候我打算进一步讨论这个问题但首先想到的这将是一个好主意用我的购物例子我用了几个星期前在我的定义策略模式泰尔不问及其后续行动拆卸泰尔不要问博客 首先定义用最简单的术语您可以将策略模式定义为告诉对象执行一项工作并使用ANOTHER对象来执行它。 为了进一步阐明这一点我将通过给它一个pay*方法来稍微重新设计ShoppingCart public class ShoppingCart {private final ListItem items;public ShoppingCart() {items new ArrayListItem();}public void addItem(Item item) {items.add(item);}public double calcTotalCost() {double total 0.0;for (Item item : items) {total item.getPrice();}return total;}public boolean pay(PaymentMethod method) {double totalCost calcTotalCost();return method.pay(totalCost);} } 关于pay方法要注意的是它采用了类型PaymentMethod的一个参数–在我上面的定义中PaymentMethod是“ ANOTHER”对象。 接下来要做的是将PaymentMethod定义为接口。 为什么要使用界面 这是因为该技术的强大之处在于您可以在运行时决定将哪种具体类型传递给ShoppingCart进行付款。 例如给定“付款”界面 public interface PaymentMethod {public boolean pay(double amount);} 然后您可以定义任何具体的付款对象例如Visa或MasterCard例如 public class Visa implements PaymentMethod {private final String name;private final String cardNumber;private final Date expires;public Visa(String name, String cardNumber, Date expires) {super();this.name name;this.cardNumber cardNumber;this.expires expires;}Overridepublic boolean pay(double amount) {// Open Comms to Visa// Verify connection// Paybill using these detailsreturn true; // if payment goes through}} …和 public class MasterCard implements PaymentMethod {private final String name;private final String cardNumber;private final Date expires;public MasterCard(String name, String cardNumber, Date expires) {super();this.name name;this.cardNumber cardNumber;this.expires expires;}Overridepublic boolean pay(double amount) {// Open Comms to Mastercard// Verify connection// Paybill using these detailsreturn true; // if payment goes through}} 最后要做的就是通过单元测试来证明这一点payBillUsingVisa Testpublic void payBillUsingVisa() {ShoppingCart instance new ShoppingCart();Item a new Item(gloves, 23.43);instance.addItem(a);Item b new Item(hat, 10.99);instance.addItem(b);Date expiryDate getCardExpireyDate();PaymentMethod visa new Visa(CaptainDebug, 1234234534564567, expiryDate);boolean result instance.pay(visa);assertTrue(result);}private Date getCardExpireyDate() {Calendar cal Calendar.getInstance();cal.clear();cal.set(2015, Calendar.JANUARY, 21);return cal.getTime();} 在上面的代码中您可以看到我正在创建一个ShoppingCart然后添加了一些商品。 最后我以Visa对象的形式创建了一个新的PaymentMethod并将其注入到payPaymentMethod method函数中这是问题的症结所在。 在另一种情况下我可以轻松创建一个MasterCard对象并将其用作Visa的直接替代品-即作为参数传递的对象是在运行时确定的。 这就定义了战略模式但这还不是博客的结尾。 如果您曾经使用过Spring但从未听说过Strategy模式那么您应该对这一切感到有些熟悉。 这是因为事实证明Spring的家伙使用策略模式来支撑他们的整个技术。 如果以上面的示例为例并进行一些细微更改我可以得出 Component public class SpringShoppingCart {private final ListItem items;AutowiredQualifier(Visa)private PaymentMethod method;public SpringShoppingCart() {items new ArrayListItem();}public void addItem(Item item) {items.add(item);}public double calcTotalCost() {double total 0.0;for (Item item : items) {total item.getPrice();}return total;}public boolean pay() {double totalCost calcTotalCost();return method.pay(totalCost);} } 这种化身与第一个化身之间的唯一区别是使用Autowired注释加载策略类Visa时Spring会注入该策略类。 综上所述我猜想这意味着策略模式是世界上最受欢迎的模式。 *出于讨论的目的我假设ShoppingCart可以自己付费但是这是否正确是一个全新的博客…… 参考 Captain Debug博客博客中来自JCG合作伙伴 Roger Hughes的《策略模式》 。 翻译自: https://www.javacodegeeks.com/2012/04/strategy-pattern.html策略模式应用场景和uml
http://wiki.neutronadmin.com/news/1236/

相关文章: