您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java设计模式——策略模式

小志的博客 发布时间:2021-01-17 21:13:13 ,浏览量:0

目录
    • 一、迭代器模式的定义与类型
    • 二、策略模式的适用场景
    • 三、策略模式的优点
    • 四、策略模式的缺点
    • 五、策略模式的相关设计模式
    • 六、策略模式示例
    • 七、策略模式在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类图如下: 在这里插入图片描述

七、策略模式在jdk源码中的应用

1、java.util包下的Comparator接口,如下图: 在这里插入图片描述 2、java.util包下的Arrays类中的sort方法使用了Comparator接口,把Comparator当参数传递,进行比较,如下图: 在这里插入图片描述在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.1503s