Java策略模式应用实例

位置:首页>文章>详情   分类: 教程分享 > Java教程   阅读(1190)   2023-03-28 11:29:14

策略模式简介

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

在本教程中,我们将学习如何在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()方法。

策略模式对比状态模式

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


 
标签: Java策略模式
地址:https://www.leftso.com/article/676.html

相关阅读

策略模式简介策略设计模式是一种行为模式,其中我们有多种算法/策略来实现任务,以及使用哪种算法/策略供客户选择
介绍在本教程中,我们将探索另一种流行的行为设计模式 - 状态设计模式
java Queue队列实现生产消费模式,什么是Java编程中的Queue(队列),手动实现生产者消费者模式
以前我们看过工厂和抽象工厂模式。这些模式可以达到其目的,并且可以非常有用,但是有一些用例我们必须创建一个非常复杂的对象,并且创建它需要不同的步骤,每个步骤都需要不同的操作。在这种情况下,构建器模...
Apache配置worker模式_Apache配置worker模式调优
Java中的五种单例模式
MongoDB索引策略和索引类型说明
java常见面试题之冒泡排序
垃圾回收(GC)一直是Java受欢迎背后的重要特性之一。垃圾回收是Java中用于释放未使用的内存的机制。本质上,它追踪所有仍在使用的对象,并将剩下的标记为垃圾。Java的垃圾回收被认为是一种自动...
概述       Log4j2 RollingFileAppender是一个OutputStreamAppender,它遵循有关何时应进行滚动(备份)的已配置触发策略,将日志消息写入文件