java设计模式——策略模式

原则
分离变化部分,封装接口,基于接口编程各种功能。此模式让行为的变化独立于算法的使用者。
策略模式的优点

  1. 提供了快速替换继承关系的办法
  2. 减少代码中的if else 等判断语句
  3. 实现的选择:策略模式可以提供不同的实现。
    策略模式的缺点
  4. 策略模式会造成很多策略类
  5. 通讯开销很大
  6. 必须自行知道所有的实现类有何不同?
    因此只有当行为类和角色行为相关的时候才需要使用策略模式。
    策略模式所用到的三个设计原则
  7. 封装变化。供动态改变调用。
  8. 针对接口,超类编程,不针对实现编程。
  9. 多用组合,少用继承。组合最大的好处就是具有弹性,给代码维护和需求修改提供极大的便利。

    有一场演讲比赛,有十个评委对参赛选手的成绩进行打分,但最终要通过评委的平均分来决定选手的名次。现在有两种求平均分的策略:
    第一种:将十名裁判的分加起来求平均值。
    第二种:去掉最高分和最低分后求平均值。
    策略模式结构中包含了三种角色:1.策略 2.上下文 3.具体策略
    策略:策略是一个接口,该接口定义若干算法标识,即定义了若干个抽象方法。
    上下文(context):上下文是依赖接口的类(是面向策略二设计的类),即上下文中包含了策略变量。上下文中提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法。
    具体策略:具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法。
    策略模式
    代码
/**
 * 策略接口
 * @author lu
 * @since  1.0, 2020年6月22日
 */
public interface Strategy {
    public double getAverge(double a[]);
}
/**
 * 策略A:直接求平均分
 * @author lu
 * @since  1.0, 2020年6月22日
 */
public class StrategyA implements Strategy{

    @Override
    public double getAverge(double[] a) {
        double score = 0,sum = 0;
        for (int i = 0; i < a.length; i++) {
            sum = sum + a[i];
        }
        score = sum/a.length;
        return score;
    }
}
/**
 * 策略B:去掉最高分和最低分后求平均分
 * @author lu
 * @since  1.0, 2020年6月22日
 */
public class StrategyB implements Strategy{

    @Override
    public double getAverge(double[] a) {
        double score = 0,sum = 0;
        Arrays.sort(a);
        for (int i = 1; i < a.length-1; i++) {
            sum = sum+a[i];
        }
        score = sum/(a.length-2);
        return score;
    }
    
}
/**
 * 策略上下文
 * @author lu
 * @since  1.0, 2020年6月22日
 */
public class StrategyContext {
    
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
    

    /**
     * 构造函数
     * @param strategy
     */
    public StrategyContext(Strategy strategy) {
        super();
        this.strategy = strategy;
    }



    public double getAverge(double a[]){
        if(strategy != null){
            double averge = strategy.getAverge(a);
            return averge;
        }else{
            System.out.println("没有求平均值的策略");
            return -1;
        }
    }     
}
/**
 * 测试客户端
 * @author lu
 * @since  1.0, 2020年6月22日
 */
public class Client {
    public static void main(String[] args) {
        //打分
        double a[] = {1,6,2,5,3,9,7,8,6,5};
        //1、创建具体打分策略
        StrategyA strategyA = new StrategyA();
        //2、创建策略上下文时将具体的策略实现对象注入到上下文中
        StrategyContext strategyContext = new StrategyContext(strategyA);
        //3、完成具体的策略实现的调用
        double averge = strategyContext.getAverge(a);
        System.out.println("策略A平均分:"+averge);
        
        //=====第二种策略=====
        StrategyB strategyB = new StrategyB();
        strategyContext.setStrategy(strategyB);
        averge =strategyContext.getAverge(a);
        System.out.println("策略B平均分:"+averge);
                
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
策略模式(Strategy Pattern)是Java设计模式中的一种行为型模式,它定义了一系列的算法,并将每个算法封装在独立的类中,使得它们可以互相替换。这样可以使得算法的变化独立于使用它们的客户端。 在策略模式中,有三个主要角色: 1. 环境类(Context):持有一个策略类的引用,用于调用具体的策略。 2. 抽象策略类(Strategy):定义了一个公共接口或抽象类,用于具体策略类的统一调用。 3. 具体策略类(Concrete Strategy):实现了抽象策略类定义的接口或抽象类,提供具体的算法实现。 使用策略模式可以实现算法的动态切换,增加新的算法也不会影响到已有的代码。例如,假设我们需要实现一个排序算法,可以定义一个抽象策略类 SortStrategy,然后具体的排序算法(如快速排序、归并排序等)分别实现 SortStrategy,并在环境类中持有 SortStrategy 的引用。这样,通过更换不同的 SortStrategy 对象,就可以在运行时选择不同的排序算法。 策略模式能够有效地解耦策略的定义和使用,提高代码的灵活性和可维护性。同时,它也符合面向对象设计原则中的"开闭原则"(对扩展开放,对修改关闭)和"单一职责原则"(一个类应该只有一个引起变化的原因)。 希望这个简要的介绍能够帮助到你对策略模式的理解。如果还有其他问题,可以继续提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值