策略设计模式

时间:2021-08-13 22:02:43

简介

策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

实现

策略设计模式由以下几个部分组成

  • 封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。
  • 抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这
    部分公共的代码,此时,策略模式看上去更像是模版方法模式。
  • 具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要*替换。

假设有这样一个需求

商店购物

  • 青铜会员打九五折
  • 白银会员打九折
  • 白金会员打八折

  1. 我们先写抽象策略
public interface Strategy {
double getPrice(double standardPrice);
}
  1. 三种具体策略
/**
* 青铜用户
* @author guxiang
* @date 2017-2-23 下午8:09:56
*/

public class BronzeMember implements Strategy {

public double getPrice(double standardPrice) {
System.out.println("九五折");
return standardPrice*0.95;
}

}
/**
* 白银用户
* @author guxiang
* @date 2017-2-23 下午8:10:57
*/

public class SilverMember implements Strategy {

public double getPrice(double standardPrice) {
System.out.println("九折");
return standardPrice*0.9;
}

}
/**
* 白金用户
* @author guxiang
* @date 2017-2-23 下午8:10:23
*/

public class PlatinoMember implements Strategy{

public double getPrice(double standardPrice) {
System.out.println("八折");
return standardPrice*0.8;
}

}
  1. 封装类(上下文类)
/**
* context负责具体与策略类的交互
* 在spring中的依赖注入功能,可以通过配置文件,动态注入策略对象
* @author guxiang
* @date 2017-2-23 下午8:53:57
*/

public class Context {
private Strategy strategy;

//构造注入
public Context(Strategy strategy) {
super();
this.strategy = strategy;
}
//set方法注入
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}

public void getFinallyPrice( double standardPrice) {
System.out.println("报价是"+strategy.getPrice(standardPrice));
}
}

策略模式的本质其实就是 分离算法,选择实现

  • JAVASE中的GUI编程就中的布局管理器是最常用的策略模式,Flow布局,Border布局,Card布局
  • Spring框架中,Resource接口,实现的资源访问策略