策略模式

策略模式介绍

概述

所谓策略,指的是一个类的行为或其算法可以在运行时更改.
就像出行选择的交通工具,要根据自己的情况,可以自由切换自行车,汽车,火车等等.

三个角色

环境Context 持有策略strategy的引用,通过引用来调用某ConcreteStrategy定义的算法。

抽象策略Strategy 定义所有支持的算法的公共接口

具体策略ConcreteStrategy 实现的策略类

类图

代码实现

1.抽象策略接口

public interface Strategy {
    
    public void travel();

}

具体策略的实现

public class BikeStrategy implements Strategy{

    @Override
    public void travel() {
        // TODO Auto-generated method stub
        System.out.println("we can travel by bike");

    }

}
public class BusStrategy implements Strategy{

    @Override
    public void travel() {
        // TODO Auto-generated method stub
        System.out.println("we can travel by Bus");

    }

}

public class CarStrategy implements Strategy{

    @Override
    public void travel() {
        // TODO Auto-generated method stub
        System.out.println("we can travel by Car");
    }

}

3.策略持有者和执行者

public class Context {
       private Strategy strategy;

       public Context(Strategy strategy){
          this.strategy = strategy;
       }

    public void executeStrategy(){
           strategy.travel();
       }

}

4.测试


public class Test {
    
    /**
     * 构建的过程放在客户端,客户端根据自己的需求 ,自己选择不同的策略
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("===========我选择策略一==========");
        Strategy strategy=new CarStrategy();
        Context context =new Context(strategy);
        context.executeStrategy();
        System.out.println("===========我选择策略二==========");
        Strategy strategy1=new BikeStrategy();
        Context context1 =new Context(strategy1);
        context1.executeStrategy();
        System.out.println("===========我选择策略三==========");
        Strategy strategy3=new BusStrategy();
        Context context3 =new Context(strategy3);
        context3.executeStrategy();

    }

}

5.测试结果

===========我选择策略一==========
we can travel by Car
===========我选择策略二==========
we can travel by bike
===========我选择策略三==========
we can travel by Bus

总结

写法类似于状态模式,但思想却不像状态模式.

策略模式注重于,采用何种策略,去解决问题.策略构建的过程放在客户端,客户端根据自己的需求 ,自己选择不同的策略

状态模式则注重于,切换状态,以及优雅的切换状态中的动作.状态构建的过程放在Context中,客户端只需要执行不同的动作即可.

但是话又说回来,'if else'可以用策略模式和状态模式代替

其实这都使用了面向对象的多态的特性==>子类的对象可以指向父类的引用,允许不同类的对象对同一消息作出响应.

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

推荐阅读更多精彩内容

  • 1 场景问题# 1.1 报价管理## 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的...
    七寸知架构阅读 4,972评论 9 60
  • 1 场景问题 1.1 报价管理 向客户报价,对于销售部门的人来讲,这是一个非常重大、非常复杂的问题,对不同的客户要...
    4e70992f13e7阅读 3,057评论 2 16
  • 本文仅仅为入门,高手勿喷。 实际工作中,我们总会遇到类似如下的需求:某支付系统接入以下几种商户进行充值:易宝网易,...
    JarvanMo阅读 14,204评论 14 26
  • 1.概述 demo地址,欢迎star 例子1: 商场产品销售:可以正常价格售出,可以打折形式售出,也可以通过积分的...
    barry阅读 734评论 0 1
  • 1.问题例1:一个菜单功能能够根据用户的“皮肤”首选项来决定是否采用水平的还是垂直的排列形式。同事可以灵活增加菜单...
    小飞猪阅读 356评论 0 0