文档章节

策略模式【Strategy Pattern】

SunnyTime
 SunnyTime
发布于 2016/09/19 17:25
字数 662
阅读 29
收藏 0

在软件开发过程中有这样一种场景.假设,我们公司的业务人员去实勘房源(检测用户发布的房子是否是真的),如果一个月实勘了十套以上,五十套一下的N套房源则奖励该业务员(1N + 10)个积分,十套一下奖励(1N)个积分。五十套以上奖励(1*N+25)个积分。这些积分可都是钱啊!这些算法规则都是暂时也许下一个版本就变了,这都是需求的锅。


一种场景对应一种解决方式。策略模式,他定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到算法客户(大话设计模式)。


public interface Ialgorithm {
    //算法内容
    int algorithmAction();
}

/**
 * 算法管理类
 * Created by dushiguang on 16/9/19.
 */
public class AlgorithmContext {
    Ialgorithm mIalgorithm;

    public AlgorithmContext(Ialgorithm mIalgorithm) {
        this.mIalgorithm = mIalgorithm;
    }

    public int ContextInterface() {
        return mIalgorithm.algorithmAction();
    }
}

/**
 * 实勘数小于10的算法
 */
public class AlgorithmLose10 implements Ialgorithm {
    private int num;
    public AlgorithmLose10(int num) {
        this.num = num;
    }

    @Override
    public int algorithmAction() {
        System.out.print("小于10的算法");
        return num;
    }
}

/**
 * 实勘数小于10大于50的算法
 */
public class AlgorithmMore10 implements Ialgorithm {
    private int num;
    public AlgorithmMore10(int num) {
        this.num = num;
    }

    @Override
    public int algorithmAction() {
        System.out.print("大于10小于50的算法");
        num = num + 10;
        return num;
    }
}

**
 * 实勘数大于50的算法
 */
public class AlgorithmMore50 implements Ialgorithm {
    private int num;
    public AlgorithmMore50(int num) {
        this.num = num;
    }

    @Override
    public int algorithmAction() {
        System.out.print("大于50的算法");
        num = num + 25;
        return num;
    }
}

/**
 * 使用者类
 */
public class MainAction {
    private AlgorithmContext mAlgorithmContext;
    private int num;
  
    /**
     *
     * @param tag 根据参数选择相应的算法
     */
    private void acticon(int tag) {
        if(tag < 10 && tag > 0) {
            mAlgorithmContext = new AlgorithmContext(new AlgorithmLose10(tag));
            num = mAlgorithmContext.ContextInterface();
        } else if (tag > 10 && tag < 50) {
            mAlgorithmContext = new AlgorithmContext(new AlgorithmMore10(tag));
            num = mAlgorithmContext.ContextInterface();
        } else if(tag > 50) {
            mAlgorithmContext = new AlgorithmContext(new AlgorithmMore50(tag));
            num = mAlgorithmContext.ContextInterface();
        }
        System.out.print("---" + num);
    }
}

这样可扩展性(OPC)就大大增加了,增加相应的算法类,修改选择添加即可。另外,策略模式和工厂模式结合起来可以更加降低耦合性。


PS:对于设计模式我只是作为学习笔记来写的,并非网上大牛们的手笔,所以各位看官看看就行,有错误请多多指正,要真正学习设计模式,书籍有,《大话设计模式》,这个需要C++语言底子,《您的设计模式》这个讲解的很有风趣,没有《大话设计模式》讲解的深,还有一本《Head First 设计模式》也讲解的蛮有意思的。

© 著作权归作者所有

SunnyTime

SunnyTime

粉丝 6
博文 27
码字总数 17058
作品 0
静安
程序员
私信 提问
设计模式——Java中常用的9种设计模式

Factory Pattern(工厂模式)   将程序中创建对象的操作,单独出来处理,大大提高了系统扩展的柔性,接口的抽象化处理给相互依赖的对象创建提供了最好的抽象模式。 2. Facade Pattern (门面...

utopia1985
2013/06/19
125
0
Head First Design Pattern 读书笔记(1) 策略模式

Head First Design Pattern 读书笔记(1) Strategy Pattern 策略模式 这几天为了锻炼看英语文档的能力,开着有道硬着头皮看 《Head First Desgin Pattern》的原版书,顺便做下笔记,把里面提...

Tek_Eternal
2015/01/02
71
0
Java设计模式系列一(前言)

说起设计模式,很多人都会觉得这个概念很熟悉,会想到单例模式、工厂模式等等,但是似乎又说不出来什么,说不上它的核心思想和设计原则。其实我们的项目中,为了代码复用,增加可维护性,很多...

Mooree
04/07
27
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
2018/04/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

哈希

第一个只出现一次的字符的位置

Garphy
24分钟前
4
0
Centos7.7之离线安装kubectl

Centos7.7,kubernates-1.13.5. 我的Centos7.7上已经安装了kubernates 1.13.5,但是没有kubectl命令,手动安装 浏览器中访问https://storage.googleapis.com/kubernetes-release/release/sta......

克虏伯
26分钟前
4
0
redis原理及应用

一、redis来源 二、数据类型 三、主流的应用场景 四、特性 五、补充 一、 redis来源 redis作者:Salvatore Sanfilippo (antirez),男,意大利人. 需求:一个访客信息追踪网站,网站可以通过...

天子剑毅
34分钟前
3
0
12_多线程

12_多线程 wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器(释放锁)。 notify():一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级高的那个...

行者终成事
39分钟前
5
0
图片的切换功能

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title></title> <style type="text/css"> * { margin: 0; padding: 0; ......

zhengzhixiang
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部