设计模式之——策略模式

本文介绍了策略模式在Java编程中的应用,通过一个排序算法的例子展示了如何使用策略模式来替换冗余的if...else语句,提高代码的可扩展性和灵活性。通过使用Comparable接口,进一步简化了排序代码。策略模式的优势在于降低代码重复,易于扩展,并遵循开闭原则。

策略模式(Strategy)

定义

策略(Strategy)模式的定义: 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

应用情景

        在我们开发过程中肯定会遇到使用一个算法时可能要引入或返回不同的类型,若使用if...else则会使代码看起来繁琐多余。那么就可以通过将这些算法封装成一个一个的类,使其可以根据需要任意地替换。

只看理论比较难理解,我通过java程序来举例子:

public class Main {
    public static void main(String[] args) {
        int[] a = {5, 7, 3, 1};
        Strategy sorter = new Strategy();
        sorter.sort(a);
        System.out.println(Arrays.toString(a));
    }
}

//排序算法
class Strategy{
    public void sort(int[] a) {
        for (int i = 0; i < a.length-1; i++) {
            int index = i;
            for (int j = i+1; j < a.length; j++) {
                index = a[j] < a[index] ? j : index;
            }
            int temp = a[i];
            a[i] = a[index];
            a[index] = temp;
        }
    }
}

        比如我们通过上面的程序可以对int数组进行排序,若是想让这个程序也能对double类型的数组进行排序,我们就需要在Sorter类中在重写一个sort(double[] a)方法并将参数类型换成double。若想比较其他类型以此类推,使用户可以根据自己的需要来使用。这就是一种简单的策略模式。

使用comparable优化

通过上面的举例可以看出,这样封装一系列的算法会使代码繁杂多余,那么这里就可以用到Comparable类型进行比较,减少代码量。
关于comparable的用法参考javase官方文档。

我们把参数类型改成Comparable类型,判断使用compareTo()方法,对排序代码优化:

class Strategy {
    public void sort(Comparable[] a) {
        for (int i = 0; i < a.length-1; i++) {
            int index = i;
            for (int j = i+1; j < a.length; j++) {
                index = a[j].compareTo(a[index]) == -1 ? j : index;
            }
            Comparable temp = a[i];
            a[i] = a[index];
            a[index] = temp;
        }
    }
}

        因为Comparable只会根据<、=、>返回结果-1、0、1,排序方法只需要根据比较结果来进行判断,所有就不需要根据用户想使用的类型来更改参数。

策略模式结构

策略类型结构如下:

  • 策略类中包含可能用到的不同参数类型的策略方法
  • 程序调用策略方法使用不同的参数
    策略结构

优点:

  1. 代码重复率低,易扩展。
  2. 可以将公共代码写入父类,子类重写策略来提高代码灵活性。
  3. 遵循开闭原则

最近清明放假没更新学习文章,主要是因为生病了要做个小手术,再加上身在外地想回家看看了。大家要多注意身体啊,,

### Java策略模式的设计与实现 #### 策略模式简介 策略模式(Strategy Pattern),又称政策模式,是一种行为设计模式。此模式允许定义一系列算法,并将每一个算法封装起来,使它们可以互换使用[^2]。 #### 接口声明公共方法 为了实现策略模式,首先需要创建一个接口来声明所有支持版本的公共操作。例如,在处理不同类型的支付方式时,可以定义 `PaymentStrategy` 接口: ```java public interface PaymentStrategy { void pay(int amount); } ``` #### 创建具体策略类 接着,通过不同的类去实现这个接口中的方法,这些类代表具体的策略。比如信用卡支付和PayPal支付两种不同的付款方式: 对于信用卡支付: ```java public class CreditCardPayment implements PaymentStrategy { private String cardNumber; public CreditCardPayment(String cardNum){ this.cardNumber = cardNum; } @Override public void pay(int amount) { System.out.println(amount + " paid with credit/debit card"); } } ``` 而对于PayPal支付,则有另一个实现: ```java public class PayPalPayment implements PaymentStrategy { private String emailId; public PayPalPayment(String email){ this.emailId=email; } @Override public void pay(int amount) { System.out.println(amount + " paid using PayPal."); } } ``` 上述两个类实现了相同的接口并提供了各自特有的逻辑,这就是所谓的“具体策略”。 #### 上下文环境设置 最后一步是在上下文中利用这些策略对象。这里我们构建了一个购物车的例子,它接受任何实现了 `PaymentStrategy` 的实例作为参数来进行结账过程: ```java class ShoppingCart { private PaymentStrategy paymentMethod; // 构造函数注入依赖关系 public ShoppingCart(PaymentStrategy pm) { this.paymentMethod=pm; } public void checkout() { int totalAmount = calculateTotal(); paymentMethod.pay(totalAmount); } private int calculateTotal(){ // 计算总价... return 100; } } ``` 这样就完成了整个流程:客户端可以选择合适的支付手段传入到购物车内完成交易动作[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值