java策略模式

其他设计模式
java单例模式
java建造者模式
java策略模式
java代理模式
java观察者模式
java适配器模式
java外观模式

模式的定义

策略模式定义了一系列的算法,并将每一个算法封装起来,而且它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

使用场景

  • 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
  • 需要安全的封装多种同一类型的操作时。
  • 出现同一抽象多个子类,而又需要使用if-else 或者 switch-case来选择时。

实现方式

举例说明

A旗舰店除了正常日不打折,在节假日会推出满300减100,全场8折等活动

步骤1:定义抽象策略角色(Strategy):现金收费抽象类

abstract class CashSuper {
    public abstract double acceptCash(double money);
}

步骤2:定义具体策略角色(Concrete Strategy):每个节日具体的促销活动

正常收费类

public class CashNormal extends CashSuper{
    @Override
    public double acceptCash(double money) {
        return money;
    }
}

打折收费类

public class CashRebate extends CashSuper{
    private double moneyRebate=1;
    public CashRebate(double moneyRebate){
        this.moneyRebate=moneyRebate; //如八折时,传入0.8
    }
    @Override
    public double acceptCash(double money) {
        return money*moneyRebate;
    }
}

满减收费类

public class CashReduce extends CashSuper{
    private double moneyCondition=0;
    private double moneyReduce=0;

    public CashReduce(double moneyCondition, double moneyReduce) { //如满300减100,传入300,100
        this.moneyCondition = moneyCondition;
        this.moneyReduce = moneyReduce;
    }

    @Override
    public double acceptCash(double money) {
        double result=money;
        if (money>moneyCondition){//若大于满减条件,减去满减值
            result=money-Math.floor(money/moneyCondition)*moneyReduce;
        }
        return result;
    }
}

步骤3:定义环境角色(Context):用于连接上下文,即把促销活动推销给客户,这里可以理解为销售员

public class CashContext {
    private CashSuper cs = null;

    public CashContext(String type) {
        switch (type) {
            case "normal":
                CashNormal cashNormal = new CashNormal();
                cs = cashNormal;
                break;
            case "rebate":
                CashRebate cashRebate = new CashRebate(0.8);
                cs = cashRebate;
                break;
            case "reduce":
                CashReduce cashReduce = new CashReduce(300, 100);
                cs = cashReduce;
                break;
        }
    }

    public double getResult(double money) {
        return cs.acceptCash(money);
    }
}

步骤4:客户端调用

public class SalesMan {
    public static void main(String[] args) {

        CashContext mSalesMan;

        //平常不打折,消费了1000
        mSalesMan = new CashContext("normal");
        double normalResult = mSalesMan.getResult(1000);
        System.out.println("平常:" + normalResult);

        //国庆打8折,消费了1000
        mSalesMan = new CashContext("rebate");
        double rebateResult = mSalesMan.getResult(1000);
        System.out.println("国庆:" + rebateResult);

        //元旦满30减100,消费了1000

        mSalesMan = new CashContext("reduce");
        double reduceResult = mSalesMan.getResult(1000);
        System.out.println("元旦:"+reduceResult);
    }

}

输出结果
平常:1000.0
国庆:800.0
元旦:700.0

优点:

  • 结构清晰明了、使用简单直观。
  • 耦合度相对而言较低,扩展方便。
  • 操作封装也更为彻底,数据更为安全。

缺点:

  • 随着策略的增加,子类也会变得繁多。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容

  • 在阎宏博士的《Java与模式》一书中开头是这样描述策略(Strategy)模式的:策略模式属于对象的行为模式。其用...
    今晚打肉山阅读 318评论 0 0
  • 1 场景问题# 1.1 报价管理## 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的...
    七寸知架构阅读 4,895评论 9 60
  • 关于策略模式,可以简单的认为,将一段算法操作,抽取出来,通过接口的形式进行声明,然后在各自的子类写出各自的实现,这...
    草丛伦阅读 217评论 0 2
  • 1 场景问题 1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要...
    4e70992f13e7阅读 3,006评论 2 16
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,820评论 1 15