设计模式第16篇:策略设计模式

一.策略设计模式介绍

     在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据应用场景的不同选择不同的算法或者策略来完成该功能。比如定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换,使得算法可独立于使用它的客户而变化,这就是策略模式。

二.策略设计模式代码用例

  这里以一个支付的例子来说明。网上购物时,当在购物车中结算时都会有多种支付选择,比如余额宝、花呗、银行卡等多种支付方式,这里就可以选择策略模式。

  1.首先定义一个支付策略接口

interface PaymentStrategy {
         
    public void pay(int amount);
}

  2.支付策略实现类

  这里写余额宝、花呗两个支付策略为例

class YuEBaoStrategy implements PaymentStrategy {

    private String password;
    
    public YuEBaoStrategy(String password){
        this.name=password;
    }
    @Override
    public void pay(int amount) {
        System.out.println(amount +" 余额宝支付");
    }

}

class HuaBeiStrategy implements PaymentStrategy {

    private String expiryDate;
    private String password;
    
    public PaypalStrategy(String expiryDate, String password){
        this.expiryDate=expiryDate;
        this.password=password;
    }
    
    @Override
    public void pay(int amount) {
        System.out.println(amount + " 花呗支付,还款截止日期:下月"+expiryDate);
    }

}

  3.定义商品类

class Item {

    private String name;
    private int price;
    
    public Item(String name, int cost){
        this.name=name;
        this.price=cost;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }
    
}

  4.定义一个购物车

import java.util.ArrayList;
import java.util.List;

 class ShoppingCart {

    //List of items
    List<Item> items;
    
    public ShoppingCart(){
        this.items=new ArrayList<Item>();
    }
    
    public void addItem(Item item){
        this.items.add(item);
    }
    
    public void removeItem(Item item){
        this.items.remove(item);
    }
    
    public int calculateTotal(){
        int sum = 0;
        for(Item item : items){
            sum += item.getPrice();
        }
        return sum;
    }
    
    public void pay(PaymentStrategy paymentMethod){
        int amount = calculateTotal();
        paymentMethod.pay(amount);
    }
}

  5.测试类

public class ShoppingCartTest {

    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        
        Item item1 = new Item("vivox23",2699);
        Item item2 = new Item("oppo FindX",3999);
        
        cart.addItem(item1);
        cart.addItem(item2);
        
        //余额宝支付
        cart.pay(new YuEBaoStrategy("支付密码"));
        
        //花呗支付
        cart.pay(new HuaBeiStrategy("2月13号","支付密码"));
    }

}

三.策略设计模式应用

  当针对特定的任务选用特定的算法时应该考虑策略设计模式。

  jdk中用到该模式的方法:Collections.sort(),Arrays.sort().

原文地址:https://www.cnblogs.com/quxiangxiangtiange/p/10285465.html