设计模式 之 策略模式


声明:本文转载自https://my.oschina.net/gmarshal/blog/2876104,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

设计模式 之 策略模式

定义

提供几个算法策略,选择其中一个策略去执行。

优点

  • 由于将算法封装成单独的策略,策略可以灵活切换。
  • 扩展性好,符合开闭原则。

缺点

  • 策略多,类也会变多
  • 策略类需要对外暴露

代码

场景

常见的加、减、乘、除,客户端选择其中一个算法进行计算。

代码

IOperation

/**
 * 操作接口
 * @author GaoYuan
 * @date 2018/11/11 下午2:45
 */
public interface IOperation {
    /** 执行计算 */
    int operation(int a,int b);

}

加、减、乘、除具体的算法实现类

/**
 * 加法
 */
public class AddOperation implements IOperation{

    @Override
    public int operation(int a, int b) {
        return a + b;
    }
}
/**
 * 减法
 */
public class SubOperation implements IOperation{

    @Override
    public int operation(int a, int b) {
        return a - b;
    }
}
/**
 * 乘法
 */
public class MulOperation implements IOperation{

    @Override
    public int operation(int a, int b) {
        return a * b;
    }

}
/**
 * 除法
 */
public class DivOperation implements IOperation{

    @Override
    public int operation(int a, int b){
        if(b == 0){
            return 0;
        }
        return a / b;
    }
    
}

Context

/**
 * 使用者
 * @author GaoYuan
 * @date 2018/11/11 下午2:51
 */
public class Context {

    IOperation iOperation;

    public Context(IOperation iOperation) {
        this.iOperation = iOperation;
    }

    public int execute(int a, int b){
        return iOperation.operation(a, b);
    }
}

测试

public static void main(String[] args){
    // 加
    Context context = new Context(new AddOperation());
    System.out.println(context.execute(6,2));
    // 减
    context = new Context(new SubOperation());
    System.out.println(context.execute(6,2));
    // 乘
    context = new Context(new MulOperation());
    System.out.println(context.execute(6,2));
    // 除
    context = new Context(new DivOperation());
    System.out.println(context.execute(6,2));
}

结果输出:

8
4
12
3

策略模式 与 状态模式 区别

相同点

  • 类的结构都差不多

不同点

  • 状态模式 侧重 状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,根据状态改变行为。
  • 策略模式 侧重 调用者选择其中一种策略进行执行。根据不同的条件选择不同的策略。

策略模式 与 简单工厂模式 区别

相同点

  • 最终结果是一致的,都是根据某个情景,执行最终的算法

不同点

概念上,或者说最本质的区别

  • 简单工厂模式属于创建型模式,调用者,根据条件,可以获取直接创建好的目标对象,然后调用该对象对应的方法即可。
  • 策略模式属于行为型模式,调用者需要先创建Context对象,然后自行选择算法,以便具体调用。

当然,在一定程度上,两者也可以相结合。

码云

https://gitee.com/gmarshal/foruo-learn-java/tree/master/src/main/java/com/foruo/learn/designmode/strategy

博客

https://my.oschina.net/gmarshal/blog/2876104

欢迎关注我的个人微信订阅号:(据说这个头像程序猿专用)

输入图片说明

本文发表于2018年11月14日 20:00
(c)注:本文转载自https://my.oschina.net/gmarshal/blog/2876104,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1570 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1