策略模式--设计模式系列文章

RexFang RexFang     2022-08-27     368

关键词:

  • 概述

  在日常开发工作中,适当的使用一些设计模式,可以让代码扩展性更强,能更好地拥抱变化,让代码更加优雅。本文主要介绍设计模式中的策略模式,并附上测试示例 Demo 供大家参考。

  • 定义

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

  • 个人理解

  策略模式,针对那些动作因对象而异的情况下,把每一个动作都独立封装起来并实现同一个接口,通过组合的方式赋予对象相对应的动作,从而使得所有的动作都可以相互替换。通过策略模式,可以达到在运行时修改对象的具体动作、对象和具体动作之间解耦的效果。

  • 设计原则

  1)找出应用中可能需要变化的地方,把它们独立出来,不要和那些不需要变化的代码混在一起;

  2)面向接口编程,而不是面向实现编程;

  3)多用组合,少用继承;

  • 示例介绍

  这里我以 CF 里面的背包为例子来描述策略模式(有可能 CF 背包的设计不是我讲的这样,这里只是举例说明策略模式)。玩过 CF 的同学都知道,每个角色都有自己的背包,背包里面可以放主武器、副武器、投掷类武器等。而这几类武器,又包含多种具体型号的武器,比如:主武器可以是狙击步枪、冲锋枪,副武器可以是普通手枪、左轮手枪,投掷类武器可以是手雷、烟雾弹、闪光弹等。为了能够达到能够随时调整背包装备的效果,可以采用策略模式。UML 图如下:

 

  从上面的 UML 可以看出,先定义一个主武器的接口类 IMainArms 和投掷类武器的接口类 IThrowArms,然后让狙击步枪类 SniperRifle 和 冲锋枪类 SubmachineGun 都去实现主武器接口,让手雷类 AntitankGrenade 、闪光弹类 FlashBomb 和 烟雾弹类 SmokeBomb 都去实现投掷类武器接口,接着再在背包类 Pack 中通过 IMainArms 和 IThrowArms 两个接口声明一个主武器变量和一个投掷类武器的变量。至此,在配置背包时,就可以根据实际需要,往背包里面放不同的主武器和不同的投掷类武器,如果有新的主武器或者投掷类武器需要创建,则只需要在创建对应的类时,以相同的方式实现对应的接口后,即可像原有的武器使用方式使用新的武器。

  •  示例代码

   IMainArms 主武器接口

package strategy;

public interface IMainArms {
    void fire();

    void aim();
}

  IThrowArms 投掷类武器接口

package strategy;

public interface IThrowArms {
    void bomb();
}

  SniperRifle 狙击步枪类

package strategy;

public class SniperRifle implements IMainArms {
    private int bulletNum;

    @Override
    public void fire() {
        if(this.bulletNum>0){
            System.out.println("狙击枪扣动扳机...");
            this.bulletNum = this.bulletNum - 1;
        }
    }

    @Override
    public void aim() {
        System.out.println("狙击枪瞄准...");
    }

    public int getBulletNum() {
        return bulletNum;
    }

    public void setBulletNum(int bulletNum) {
        this.bulletNum = bulletNum;
    }

}

  SubmachineGun 冲锋枪类

package strategy;

public class SubmachineGun implements IMainArms {
    private int bulletNum;

    @Override
    public void fire() {
        if(this.bulletNum>0){
            System.out.println("冲锋枪扣动扳机...");
            this.bulletNum = this.bulletNum - 1;
        }
    }

    @Override
    public void aim() {
        System.out.println("冲锋枪瞄准...");
    }

    public int getBulletNum() {
        return bulletNum;
    }

    public void setBulletNum(int bulletNum) {
        this.bulletNum = bulletNum;
    }

}

  AntitankGrenade 手雷类

package strategy;

public class AntitankGrenade implements IThrowArms {
    private boolean isBomb;

    @Override
    public void bomb() {
        System.out.println("手雷爆炸...");
        this.setBomb(true);
    }

    public boolean isBomb() {
        return isBomb;
    }

    public void setBomb(boolean isBomb) {
        this.isBomb = isBomb;
    }

}

  FlashBomb 闪光弹类

package strategy;

public class FlashBomb implements IThrowArms {
    private boolean isBomb;

    @Override
    public void bomb() {
        System.out.println("闪光弹爆炸...");
        this.setBomb(true);
    }

    public boolean isBomb() {
        return isBomb;
    }

    public void setBomb(boolean isBomb) {
        this.isBomb = isBomb;
    }

}

  SmokeBomb 烟雾弹类

package strategy;

public class SmokeBomb implements IThrowArms {
    private boolean isBomb;

    @Override
    public void bomb() {
        System.out.println("烟雾弹爆炸...");
        this.setBomb(true);
    }

    public boolean isBomb() {
        return isBomb;
    }

    public void setBomb(boolean isBomb) {
        this.isBomb = isBomb;
    }

}

  MainTest 测试类

package test;

import strategy.AntitankGrenade;
import strategy.FlashBomb;
import strategy.Pack;
import strategy.SniperRifle;
import strategy.SubmachineGun;

public class MainTest {
    public static void main(String[] args) {
        SniperRifle sniperRifle = new SniperRifle();
        sniperRifle.setBulletNum(100);
        SubmachineGun submachineGun = new SubmachineGun();
        submachineGun.setBulletNum(50);

        AntitankGrenade antitankGrenade = new AntitankGrenade();
        antitankGrenade.setBomb(false);
        FlashBomb flashBomb = new FlashBomb();
        flashBomb.setBomb(false);

        Pack pack1 = new Pack();
        pack1.setMainArms(sniperRifle);
        pack1.setPackNo(1);
        pack1.setThrowArms(antitankGrenade);

        Pack pack2 = new Pack();
        pack2.setMainArms(submachineGun);
        pack2.setPackNo(2);
        pack2.setThrowArms(flashBomb);

        pack1.getMainArms().aim();
        pack1.getMainArms().fire();
        pack1.getThrowArms().bomb();

        pack2.getMainArms().aim();
        pack2.getMainArms().fire();
        pack2.getThrowArms().bomb();
    }
}

 

 

  欢迎转载,转载必须标明出处 

 

设计模式——策略模式

  策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。最典型的就是客户打折算法的设计,不同等级的用户打折的力度也不一样,所以... 查看详情

设计模式系列——策略模式(代码片段)

原创:花括号MC(微信公众号:huakuohao-mc)。关注JAVA基础编程及大数据,注重经验分享及个人成长。策略模式常用于一个对象的行为在运行时有多个不同的策略和算法。举个例子可以通过实现一个加、减、乘三种不用策略的运算,... 查看详情

设计模式系列2策略模式(代码片段)

什么是策略模式策略是对算法的封装,是一种形为模式,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式和简单工厂很相似,确有不同,策略是一种行为模式,而简... 查看详情

php设计模式系列:策略模式(代码片段)

策略模式策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就... 查看详情

javascript实现策略模式

  在开篇之前先分享今天看到的一句关于设计模式的话:将不变的部分和变化的部分隔开是每个设计模式的主题  请大家自行感受这句话的精髓所在,并且思考学习设计模式究竟能给我们编程带来什么样的东西,欢迎大家在... 查看详情

程序设计模式——策略模式

或许你听了之后会以为是一种策略选择方式,事实上“策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。”  敬告:在阅读的文章... 查看详情

前端也要学系列:设计模式之策略模式(代码片段)

做前端开发已经好几年了,对设计模式一直没有深入学习总结过。随着架构相关的工作越来越多,越来越能感觉到设计模式成为了我前进道路上的一个阻碍。所以从今天开始深入学习和总结经典的设计模式以及面向对象的几大原... 查看详情

设计模式(十五)状态模式

相关文章设计模式系列前言建议在阅读本文前先阅读设计模式(十一)策略模式这篇文章,虽说状态模式和策略模式的结构几乎是相同的,但是它们所解决的问题是不同的,读完这两篇文章你就会有了答案。1.状态模式定义状态... 查看详情

策略模式

策略模式策略模式是一种定义一系列算法的方法*当一些算法完毕的都是同样的工作,仅仅是实现不同,就能够用同样的方式调用全部的算法。*策略模式能够减少算法的使用类与算法类之间的耦合。封装变化点是面向对象的一种... 查看详情

从零开始单排学设计模式「策略模式」黑铁ii

阅读本文大概需要1.7分钟。 本篇是设计模式系列的第三篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统。所以现在打算重写,加上距离现在也有一段时间了,也算是... 查看详情

设计模式之策略模式(行为型)(代码片段)

一、模式定义策略模式:定义一系列算法,然后将每一个算法封装起来,并将它们可以互相替换。也就是将一系列算法封装到一系列策略类里面。策略模式是一种对象行为型模式。策略模式符合“开闭原则“StrategyPattern:Defineafami... 查看详情

策略模式(strategy)

  行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式    策略模式(Strategy)    策略模式定义了一系列算法... 查看详情

策略模式

Strategy策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式的结构  策... 查看详情

设计模式-策略模式

定义:    策略模式是对算法的包装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。优点:  算法可... 查看详情

设计模式(十七)---策略模式

1、简介  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。2、策略模式的结... 查看详情

策略模式

策略模式策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使它们可以相互替换。策略模式是对算法的包装,是把算法使用和算法本身分开。策略模式通常是把一系列算法包装到一系列的策略... 查看详情

设计模式之策略模式

  软件工程师都会学习设计模式,设计模式可以说是前人智慧与经验的结晶,虽然不是哪里都用得到,但是在合适的地方使用合适的设计模式,能够带来巨大的收益。我通过学习《headfirst设计模式》,逐渐掌握这些设计方法,... 查看详情

java设计模式—策略模式

  在阎宏博士的《JAVA与模式》一书中开头是这样描述策略(Strategy)模式的:  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模... 查看详情