设计模式2之策略模式(整理笔记)

本文通过大话西游中的“跑环”任务为背景,介绍了策略模式的应用。策略模式定义了一系列算法,将其封装以便于互相替换,使得算法的变化不会影响到使用算法的客户。文章通过实例代码展示了如何使用策略模式来解决不同路线规划的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在写代码的时候肯定遇到过这样子的事情,随着需求的不断改变,我们也会在骂娘的过程中,不断的改着自己的代码。。。。

但是高手总会花费最小的代价,完成任务,而像我这样子的渣渣。。。。(PS:我的老板,每天都会在脑子里出现一个新的创意,叫我去试试,我很受伤!!!!)

今天我记录一下我老板对我的照顾!!!顺便整理一下策略模式的一些东西。

下面是一个由真实情景改编而成(如有雷同,请默默哭一会。。)

情景:大话西游不知道玩过没有,其中有一种赚钱的方式 叫做“跑环”(你可以理解为你就是个快递员)。就是你需要在一个地方接到任务后,全游戏地图到处跑,接触到指定的200个NPC(跑的时候会接到重复的地点,但是NPC的数量肯定超过了200个)完成任务,会得到大约不到200W的金币吧如果我没有记错的话。。。。(真实的情景是我被领到会议室,小马,一会这个功能需要改,一会不好没以前好,改回去,再一会,给我在原有的基础上添加几个功能!!!)。

如果单纯的跑,即使按照3分钟跑到一个地点,3*200/60=10个小时。10小时200W,第一感觉是累死了,然后第二感觉肯定就没有知觉了--真累死了。。。。

那么为什么会有那么多人 都要做这个任务呢,我记得我最快的时候大约是90分钟,跑完了一次。。。

关键在于你必须找对方法呀。

每一次都选择最优的路线,凭借着记忆,计算出最短的路线,然后定下坐标,如果有重复的下一次就可以直接飞过来了(类似传送门),如果没有的话,就比较苦逼,先跑一遍吧。。。这样子是不是就变简单多了呢。

我们来分析一下:

我们的目标:找到对应的NPC(完成任务)

如何做:需要计算路线,跑过去,然后定下坐标,第二次就可以瞬移。。。。

其实我们做的过程就是策略模式的基本应用。、

策略模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,并不影响到使用算法的客户。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

接下来我用代码来实现:

(1)代码结构图:

(2)直接上代码:

Context类是上下文的对象,它用来生成具体的路线策略,调用具体的路线方法

public class Context {
    Strategy strategy;
    public Context(String  string){
        //根据条件生成具体的路线策略(加入了简单工厂模式)
        switch (string){
            case "大唐边境到傲来国":
                strategy=new ConcreteStrategyA();
                break;
            case "长安到洛阳":
                strategy=new ConcreteStrategyB();
                break;
            case "龙宫到凌霄宝殿":
                strategy=new ConcreteStrategyC();
                break;
        }
    }
    //这是调用具体路线策略的方法
    public void ContextInterface(){
        strategy.AlgorithmInterface();
    }
}

这个是抽象路线策略类:

abstract class Strategy {
    //这个抽象方法就是我们封装的路线方法
    public abstract void AlgorithmInterface();
}

具体的路线策略类A:

public class ConcreteStrategyA extends Strategy {
    //具体的路线
    @Override
    public void AlgorithmInterface() {
        Log.i("ConcreteStrategyA","大唐边境到傲来国");
    }
}

具体的路线策略类B:

public class ConcreteStrategyB extends Strategy {
    @Override
    public void AlgorithmInterface() {
        Log.i("ConcreteStrategyB","长安到洛阳");
    }
}


具体的路线策略类C:

public class ConcreteStrategyC extends Strategy {
    @Override
    public void AlgorithmInterface() {
        Log.i("ConcreteStrategyC","龙宫到凌霄宝殿");
    }
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

策略模式是定义一系列算法的方法,其实它定义的所有的算法完成的都是相同的工作,只是在具体实现的时候会有所不同,它可以用相同的方式调用所有的算法,这样子就减少了各种算法类和使用算法之间的耦合。(说白了,当你用策略模式定义好你的算法,客户端的开发者就可以和一个白痴一样的,调用你的Context类,不用关心里面到底实现了什么),同时,因为每个算法都有自己的类,可以通过自己的接口单独测试,这样子也简化了单元测试。

策略模式------------封装了算法的变化。

在我们开发中,只要分析出了需要在不同的时间应用不同的业务规则,就可以考虑使用策略模式来处理了

策略模式同样有一些不足,就是当每增减一种算法,就必须在Context的swich分支里面更改代码。。。在一本书里面看到了这么一句话:“任何需求的变更都需要成本,但是成本的高低是有差异的,高手和菜鸟的区别就是高手可以花同样的代价获得最大的收益或者说做同样的事情花最小的代价。”




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值