策略模式及代码案例

策略模式

策略模式解决的问题,是根据不同的应用场景而使用不同的方法解决一个问题,如果说抽象与接口的实现是多态的基础,那么策略模式则是多态在工程中一个具体的表现。

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

实际分析

笔者自身就是《剑来》的读者,让我们将策略模式带入剑来高能章节,落魄山问剑正阳山!

那一天,正阳山上观礼大典迎来了不速之客…

落魄山众人踩在各个山头上,各自报着名号,这么大的阵仗的目的只有杀si那只搬山老猿:

随着陈平安的攻心,正阳山已经决定放弃那位护山供奉,那么问题来了。

老师从小告诉我们,一件事情一共有三个元素:起因、经过、结尾

读过《剑来》的读者都知道,问剑正阳山的起因就是老猿在主角团小时,差点锤杀他们,而结果只有主角团众人君子报仇十年不晚,将搬山老猿杀人诛心

从故事的发展来看这两者是不可修改的,正因为“老猿在主角团小时,差点锤杀他们”,所以“主角团众人君子报仇十年不晚,将搬山老猿杀人诛心”。**但是“经过”可以修改呀,或者说经过可以不一样。**我们是不是可以想着换种方式来杀si老猿呢。比如换成“策反正阳山,逼迫他们杀掉老猿”,或者换成由刘羡阳来挥这一剑。

这是否对应一种策略呢,或者说是否对应一种事情的处理方式呢。

将目标从正阳山上换回我们的程序中,程序的执行也可以分为三个元素呀:起因、经过、结尾,**起因就是程序执行的入口,比如main方法,测试程序等等,结果就是我们对程序的期望,期望实现的功能。**这两者在我们对于一个已经确定功能的程序是不可变的,这是在编写程序之前就确定好的。我们可以改变的就是”经过“,或者说是程序实现的方法。

让我们将视角换回正阳山,突然陈平安心念一动,不想亲手去杀那头老猿了,打算去交给刘羡阳去挥这一剑。但是老猿只有一头,如果刘羡阳挥了剑,那么这件事情是否与起初的事情不同。**答案是肯定的,在我们程序中,一个程序对应的就是这样的一个事件,在程序内部执行的过程中不能重复一个相同时间线上的不同的步骤。**那么程序能否像这件事情一样,换一种方式执行呢,答案就是策略模式。

我认为:程序是现实中一件事情的抽象,而策略模式是对现实中一个事件的同一时间线上的不同行为的抽象

策略模式是对一个问题处理行为的封装与抽象,能使一个类的行为或其算法可以在运行时更改。
在这里插入图片描述

示例代码

按上述的逻辑,我们可以模拟出坦克的不同的开火模式。

我们首先定义一个Tank类,拥有一个fire方法,来实现不同的开火模式。

public class Tank {
    //我们可以使用策略模式来对应Tank不同的Fire_mode,来形成不同的攻击。
    private String person;

    public void fire(FireMode fireMode){
        fireMode.firedemo();
    }
    public Tank(String person) {
        this.person = person;
    }

    @Override
    public String toString() {
        return "Tank{" +
                "person='" + person + '\'' +
                '}';
    }

然后根据fire方法定义一个接口FireMode来对开火模式进行抽象:

public interface FireMode {
    //定义一个fire模式接口,不同的模式就可以去实现接口来具现化,实现多态
    void firedemo();
}

根据FireMode接口定义三个实现类:

public class SingleFire implements FireMode{
    @Override
    public void firedemo() {
        System.out.println("开火了一次");
    }
}
public class BurstFire implements FireMode{

    @Override
    public void firedemo() {
        for (int i = 0; i < 4; i++) {
            System.out.println("开火了一次"+(i+1)+"/4");
        }
    }
}
public class ChargeFIre implements FireMode{

    @Override
    public void firedemo() {
        try {
            Thread.sleep(1000);
            System.out.print(1 );
            Thread.sleep(1000);
            System.out.print(2 );
            Thread.sleep(1000);
            System.out.print(3 );
            System.out.println("蓄力开火一次");

        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

然后我们使用main方法测试一下

public static void main(String[] args) {
        Tank tank = new Tank("jack");
        tank.fire(new SingleFire());
        System.out.println("-------------");
        tank.fire(new BurstFire());
        System.out.println("-------------");
        tank.fire(new ChargeFIre());
    }

实现如图:
在这里插入图片描述

上述的代码只是为了方便展示,将三种策略同时展现了。

");
tank.fire(new ChargeFIre());
}


实现如图:

[外链图片转存中...(img-BkY1d1Go-1666187710415)]

上述的代码只是为了方便展示,将三种策略同时展现了。



好了,文章到此就结束啦,决定还不错的话点一个赞吧。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值