目录
一、迭代器模式的定义与类型
- 一、迭代器模式的定义与类型
- 二、策略模式的适用场景
- 三、策略模式的优点
- 四、策略模式的缺点
- 五、策略模式的相关设计模式
- 六、策略模式示例
- 七、策略模式在jdk源码中的应用
1、定义
- 定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户
2、类型
- 行为型
- 系统有很多类,而他们的区别仅仅在于他们的行为不同
- 一个系统需要动态地在几种算法中选择一种
- 开闭原则
- 避免使用多重条件转移语句
- 提高算法的保密性和安全性
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类
- 产生很多策略类
- 策略模式和工厂模式
- 策略模式和状态模式
以商品的优惠为例进行代码演示
1、代码结构如下
2、创建一个优惠策略接口
package com.rf.designPatterns.behavioral.strategy;
/**
* @description: 优惠策略接口
* @author: xz
*/
public interface PreferenceStragegy {
//做优惠活动方法
public void doPreference();
}
3、创建一个返现策略类
package com.rf.designPatterns.behavioral.strategy;
/**
* @description: 返现策略类
* @author: xz
*/
public class FanxianStragegy implements PreferenceStragegy{
@Override
public void doPreference() {
System.out.println("返现策略————购买商品返现的余额到用户账户。");
}
}
4、创建一个立减策略类
package com.rf.designPatterns.behavioral.strategy;
/**
* @description: 立减策略类
* @author: xz
*/
public class LijianStragegy implements PreferenceStragegy{
@Override
public void doPreference() {
System.out.println("立减策略————商品原价立减20");
}
}
5、创建一个满减策略类
package com.rf.designPatterns.behavioral.strategy;
/**
* @description: 满减策略类
* @author: xz
*/
public class ManjianStragegy implements PreferenceStragegy{
@Override
public void doPreference() {
System.out.println("满减策略————商品满500减100");
}
}
6、创建一个空的策略的类
package com.rf.designPatterns.behavioral.strategy;
/**
* @description: 空的策略
* @author: xz
*/
public class EmptyStragegy implements PreferenceStragegy{
@Override
public void doPreference() {
System.out.println("没有优惠活动");
}
}
7、创建一个优惠活动类(用于包装所有策略)
package com.rf.designPatterns.behavioral.strategy;
/**
* @description: 优惠活动类(用于包装所有策略)
* @author: xz
*/
public class PreferenceActivity {
private PreferenceStragegy preferenceStragegy;
//通过构造器注入优惠策略
public PreferenceActivity(PreferenceStragegy preferenceStragegy) {
this.preferenceStragegy = preferenceStragegy;
}
//执行优惠策略方法
public void excutePreferenceStragegy(){
preferenceStragegy.doPreference();
}
}
8、创建一个优惠策略工厂类
package com.rf.designPatterns.behavioral.strategy;
import java.util.HashMap;
import java.util.Map;
/**
* @description: 优惠策略工厂类
* @author: xz
*/
public class PreferenceStragegyFactory {
private static Map PREFERENCE_STRAGEGY_MAP=new HashMap();
static {
PREFERENCE_STRAGEGY_MAP.put(PreferenceKey.FANXIAN,new FanxianStragegy());
PREFERENCE_STRAGEGY_MAP.put(PreferenceKey.LIJIAN,new LijianStragegy());
PREFERENCE_STRAGEGY_MAP.put(PreferenceKey.MANJIAN,new ManjianStragegy());
}
//声明一个空的策略常量
private static final PreferenceStragegy NON_STRAGEGY = new EmptyStragegy();
//定义一个私有构造器,禁止外部new操作
private PreferenceStragegyFactory(){
}
//根据策略的key获取对应的策略的value
public static PreferenceStragegy getPreferenceStragegy(String PreferenceKey){
PreferenceStragegy preferenceStragegy=PREFERENCE_STRAGEGY_MAP.get(PreferenceKey);
return preferenceStragegy==null ? NON_STRAGEGY : preferenceStragegy;
}
private interface PreferenceKey{
String FANXIAN="FANXIAN";
String LIJIAN="LIJIAN";
String MANJIAN="MANJIAN";
}
}
9、策略模式测试类
package com.rf.designPatterns.behavioral.strategy;
import org.apache.commons.lang.StringUtils;
/**
* @description: 策略模式测试类
* @author: xz
*/
public class Test {
public static void main(String[] args) {
/**
* 方式一
*/
//双十一活动,调用返现策略
/* PreferenceActivity preferenceActivity1111=new PreferenceActivity(new FanxianStragegy());
preferenceActivity1111.excutePreferenceStragegy();*/
//双十二活动,调用返现策略
/* PreferenceActivity preferenceActivity1212=new PreferenceActivity(new ManjianStragegy());
preferenceActivity1212.excutePreferenceStragegy();*/
/**
* 方式二
*/
/* PreferenceActivity preferenceActivity= null;
String preferenceKey="Fanxian";
if(StringUtils.equals(preferenceKey,"Fanxian")){
preferenceActivity = new PreferenceActivity(new FanxianStragegy());
}else if(StringUtils.equals(preferenceKey,"Manjian")){
preferenceActivity =new PreferenceActivity(new ManjianStragegy());
}else if(StringUtils.equals(preferenceKey,"Lijian")){
preferenceActivity =new PreferenceActivity(new LijianStragegy());
}
preferenceActivity.excutePreferenceStragegy();*/
/**
* 方式三
*/
String preferenceKey="LIJIAN";
PreferenceActivity preferenceActivity =new PreferenceActivity(PreferenceStragegyFactory.getPreferenceStragegy(preferenceKey));
preferenceActivity.excutePreferenceStragegy();
}
}
10、运行效果如下: 11、UML类图如下:
1、java.util包下的Comparator接口,如下图: 2、java.util包下的Arrays类中的sort方法使用了Comparator接口,把Comparator当参数传递,进行比较,如下图: