leftso 84 0 2019-09-16 14:39:29

文章位置:左搜> 编程技术> Java编程技术> 正文

策略模式简介

策略设计模式是一种行为模式,其中我们有多种算法/策略来实现任务,以及使用哪种算法/策略供客户选择。 各种算法选项封装在各个类中。

在本教程中,我们将学习如何在Java中实现策略设计模式。

UML表示:

让我们首先看一下策略设计模式的UML表示:

      策略模式在这里,我们有:
 

 

  • Strategy:定义我们打算执行的常见操作的接口
  • ConcreteStrategy:这些是使用不同算法来执行Strategy接口中定义的操作的实现类
  • Context:任何需要改变行为并持有战略参考的东西
JDK中策略模式的一个流行示例是在Collections.sort()方法中使用java.util.Comparator。 我们可以将Collections.sort()方法视为上下文和我们传入的java.util.Comparator实例作为排序对象的策略。
 

实现Strategy

众所周知,任何购物网站都提供多种付款方式。 所以,让我们用这个例子来实现策略模式。

我们首先定义PaymentStrategy接口:

public interface PaymentStrategy {
    void pay(Shopper shopper);
}
现在,让我们定义两种最常见的支付方式,即货到付款和卡支付,作为两个具体的策略类:
public class CashOnDeliveryStrategy implements PaymentStrategy {
    @Override
    public void pay(Shopper shopper) {
        double amount = shopper.getShoppingCart().getTotal();
        System.out.println(shopper.getName() + " selected Cash On Delivery for Rs." + amount );
    }
}

public class CardPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(Shopper shopper) {
        CardDetails cardDetails = shopper.getCardDetails();
        double amount = shopper.getShoppingCart().getTotal();
        completePayment(cardDetails, amount);
        System.out.println("Credit/Debit card Payment of Rs. " + amount + " made by " + shopper.getName());
    }

    private void completePayment(CardDetails cardDetails, double amount) { ... }
}

实现Context

定义了我们的策略类后,现在让我们定义一个PaymentContext类:
public class PaymentContext {
 
    private PaymentStrategy strategy;
 
    public PaymentContext(PaymentStratgey strategy) {
        this.strategy = strategy;
    }
 
    public void makePayment(Shopper shopper) {
        this.strategy.pay(shopper);
    }
}
此外,我们的Shopper类看起来类似于:
public class Shopper {
 
    private String name;
    private CardDetails cardDetails;
    private ShoppingCart shoppingCart;
 
    //suitable constructor , getters and setters
    
    public void addItemToCart(Item item) {
        this.shoppingCart.add(item);
    }
 
    public void payUsingCOD() {
        PaymentContext pymtContext = new PaymentContext(new CashOnDeliveryStrategy());
        pymtContext.makePayment(this);
    }
 
    public void payUsingCard() {
        PaymentContext pymtContext = new PaymentContext(new CardPaymentStrategy());
        pymtContext.makePayment(this); 
    }
}
我们系统中的购物者可以使用其中一种可用的购买策略进行支付。 对于我们的示例,我们的PaymentContext类接受所选的付款策略,然后为该策略调用pay()方法。

策略模式对比状态模式

策略和状态设计模式都是基于接口的模式,可能看起来相似,但有一些重要的区别:
  • 状态设计模式定义了策略模式更多地讨论不同算法的各种状态
  • 在状态模式中,存在从一个状态到另一个状态的转换。 另一方面,策略模式中的所有策略类彼此独立