Strategy概述

Strategy - 图1

UML概述

Strategy - 图2

玩具代码案例 - 基于可替换排序策略的表格

策略的主体

  1. package online.javabook.gof.behavioral.patterns8.strategy1.sort.strategy;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class Table {
  5. private ISortStrategy sortStrategy;
  6. private List<Integer> results = new ArrayList();
  7. public ISortStrategy getSortStrategy() {
  8. return sortStrategy;
  9. }
  10. public void setSortStrategy(ISortStrategy sortStrategy) {
  11. this.sortStrategy = sortStrategy;
  12. }
  13. public void sort() {
  14. Integer[] array = sortStrategy.Sort(results);
  15. for (int row : array){
  16. System.out.println(row);
  17. }
  18. }
  19. public void addRow(int data) {
  20. results.add(data);
  21. }
  22. public void deleteRow(int data) {
  23. results.add(data);
  24. }
  25. }

策略的接口

ISortStrategy

package online.javabook.gof.behavioral.patterns8.strategy1.sort.strategy;

import java.util.List;

public interface ISortStrategy {
    Integer[] Sort(List<Integer> results);
}

策略的实现

DefaultSort

package online.javabook.gof.behavioral.patterns8.strategy1.sort.strategy;

import java.util.Arrays;
import java.util.List;

public class DefaultSort implements ISortStrategy {
    @Override
    public Integer[] Sort(List<Integer> results) {
        System.out.println("Quick sort results");

        Integer[] array = new Integer[results.size()];
        array = results.toArray(array);
        Arrays.sort(array);
        return array;
    }
}

ParallelSort

package online.javabook.gof.behavioral.patterns8.strategy1.sort.strategy;

import java.util.Arrays;
import java.util.List;

public class ParallelSort implements ISortStrategy {
    @Override
    public Integer[] Sort(List<Integer> results) {
        System.out.println("Parallel sort results");

        Integer[] array = new Integer[results.size()];
        array = results.toArray(array);
        Arrays.parallelSort(array);
        return array;
    }
}

策略的替换

Main

package online.javabook.gof.behavioral.patterns8.strategy1.sort.app;

import online.javabook.gof.behavioral.patterns8.strategy1.sort.strategy.ParallelSort;
import online.javabook.gof.behavioral.patterns8.strategy1.sort.strategy.DefaultSort;
import online.javabook.gof.behavioral.patterns8.strategy1.sort.strategy.Table;

public class Main {
    public static void main(String[] args) {
        Table table = new Table();
        table.addRow(1);
        table.addRow(5);
        table.addRow(2);

        table.setSortStrategy(new DefaultSort());
        table.sort();

        table.setSortStrategy(new ParallelSort());
        table.addRow(3);
        table.sort();
    }
}

Console

Quick sort results
1
2
5
Parallel sort results
1
2
3
5

玩具代码案例 - 基于可替换折扣策略的购物车

策略的主体

package online.javabook.gof.behavioral.patterns8.strategy2.shopping.stragegy;

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

public class ShoppingCart {

    private IDiscountStrategy discountStrategy;

    private List<Double> prices = new ArrayList<Double>();

    public void add(double items) {
        prices.add(items);
    }

    public IDiscountStrategy getDiscountStrategy() {
        return discountStrategy;
    }

    public void setDiscountStrategy(IDiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double getTotalPrice() {
        return this.discountStrategy.discount(prices);
    }
}

策略的接口

IDiscountStrategy

package online.javabook.gof.behavioral.patterns8.strategy2.shopping.stragegy;

import java.util.List;

public interface IDiscountStrategy {

    double discount(List<Double> prices);
}

策略的实现

Double11DiscountStrategy

package online.javabook.gof.behavioral.patterns8.strategy2.shopping.stragegy;

import java.util.List;

public class Double11DiscountStrategy implements IDiscountStrategy {

    @Override
    public double discount(List<Double> prices) {
        double total = 0;
        for(double price : prices){
            total += price;
        }
        total = total * 0.9;
        return total;
    }
}

Double12DiscountStrategy

package online.javabook.gof.behavioral.patterns8.strategy2.shopping.stragegy;

import java.util.List;

public class Double12DiscountStrategy implements IDiscountStrategy {

    @Override
    public double discount(List<Double> prices) {
        double total = 0;
        for(double price : prices){
            total += price;
        }
        total = total * 0.8;
        return total;
    }
}

策略的替换

Main

package online.javabook.gof.behavioral.patterns8.strategy2.shopping.app;

import online.javabook.gof.behavioral.patterns8.strategy2.shopping.stragegy.Double11DiscountStrategy;
import online.javabook.gof.behavioral.patterns8.strategy2.shopping.stragegy.Double12DiscountStrategy;
import online.javabook.gof.behavioral.patterns8.strategy2.shopping.stragegy.ShoppingCart;

public class Main {
    public static void main(String[] args) {
        ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.add(100);
        shoppingCart.add(200);
        shoppingCart.add(300);

        shoppingCart.setDiscountStrategy(new Double11DiscountStrategy());
        double total1 = shoppingCart.getTotalPrice();
        System.out.println(total1);

        shoppingCart.setDiscountStrategy(new Double12DiscountStrategy());
        double total2 = shoppingCart.getTotalPrice();
        System.out.println(total2);
    }
}

Console

540.0
480.0