Strategy概述
UML概述
玩具代码案例 - 基于可替换排序策略的表格
策略的主体
package online.javabook.gof.behavioral.patterns8.strategy1.sort.strategy;
import java.util.ArrayList;
import java.util.List;
public class Table {
private ISortStrategy sortStrategy;
private List<Integer> results = new ArrayList();
public ISortStrategy getSortStrategy() {
return sortStrategy;
}
public void setSortStrategy(ISortStrategy sortStrategy) {
this.sortStrategy = sortStrategy;
}
public void sort() {
Integer[] array = sortStrategy.Sort(results);
for (int row : array){
System.out.println(row);
}
}
public void addRow(int data) {
results.add(data);
}
public void deleteRow(int data) {
results.add(data);
}
}
策略的接口
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