Java设计模式之策略模式

栏目: Java · 发布时间: 6年前

内容简介:定义一组算法,将每个算法都封装起来,使得它们之间可以相互替换。策略模式让算法独立于调用它的客户端而独立变化。我清楚知道自己身上有几把武器(策略),我会根据不同的情况使用不同的武器(根据情况,切换策略)。游戏中我分别捡到三把枪:

1、初步认识:

策略模式的定义:

定义一组算法,将每个算法都封装起来,使得它们之间可以相互替换。策略模式让算法独立于调用它的客户端而独立变化。

大白话:

我清楚知道自己身上有几把武器(策略),我会根据不同的情况使用不同的武器(根据情况,切换策略)。

游戏中我分别捡到三把枪:

1、R1895消音左轮一把;

2、S12K霰弹枪(五连喷)一把;

3、AWM狙击步枪一把;

  现在我知道我身上是背有三把枪的, 然后我就可以根据敌人与我的距离切换使用合适的枪(根据情况,使用不同的策略)。

突然发现八百米开外有个敌人,我摸出AWM狙击步枪(有目的的切换武器),

  算好风速,调整好姿势,“彭”,一发入魂,敌人应声倒下。

  接着,又发现左前方有个敌人,我切换到S12K霰弹枪(有目的切换武器,切换策略),悄悄向右前方摸了过去,“突突突”

五连发,游戏结束。

2、策略模式的结构图:

Java设计模式之策略模式

3、可以看到,该模式包含三个角色:

  • 抽象策略(Strategy): 通常由接口或抽象类实现。定义了多个具体策略的公共接口,具体策略类中各种不同的算法以不同的方式实现这个接口;Context使用这些接口调用不同实现的算法。
  • 具体策略(ConcreteStrategy): 实现Strategy接口或继承于抽象类Strategy,封装了具体的算法和行为。
  • 环境类(Contex): 持有一个公共策略接口的引用,直接给客户端调用。

4、使用场景例子:

玩枪战类游戏,可以根据不同战场情况,切换枪支。

5、策略模式具体实现:

(1)给策略对象(枪)定义一个公共接口

1 public interface Weapon {
2     public void gun();
3 }

(2)定义具体的策略类(ConcreteStrategy),实现上面的接口

public class FirstGun implements Weapon {

    @Override
    public void gun() {
        System.out.println("使用AWM狙击步枪。");
    }

}
public class SecondGun implements Weapon {
    
    @Override
    public void gun() {
        System.out.println("使用S12K霰弹枪。");
    }
    
}

(3)定义一个环境类(Contex),类中持有一个对公共接口的引用,以及相应的get、set方法、构造方法

public class Context {
    Weapon weapon;
    
    public Context(Weapon weapon) { //构造函数
        super();
        this.weapon = weapon;
    }
    
    public Weapon getWeapon() { //get方法
        return weapon;
    }
    
    public void setWeapon(Weapon weapon) { //set方法
        this.weapon = weapon;
    }
    
    public void gun() {
        weapon.gun();
    }
}

最后,客户端自由调用策略(我在枪林弹雨的战场上,切换武器,击毙敌人)

public class StrategyClient {

    public static void main(String[] args) {
        //使用构造函数默认选择一把AWM狙击步枪(一个策略)
        Context context=new Context(new FirstGun());
        context.gun();
        
        //使用get、set方法切换到S12K霰弹枪(切换策略)
     System.out.println("------右前方30米发现敌人------");
        contex.set(new SecondGun());
        context.gun();
    }
}

输出结果:

Java设计模式之策略模式

5、策略模式,小结一下:

  • 重点 在于: 给对象传入什么样的策略,就执行什么样的动作。
  • 优点在于: 可以轻易的扩展与改变策略,可以动态改变对象的行为。
  • 缺点在于: 客户端必须知道所有的策略类,并自行决定使用哪一种。每个具体的策略都会产生一个新类,这样会造成很多策略类。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Learn Python the Hard Way

Learn Python the Hard Way

Zed A. Shaw / Addison-Wesley Professional / 2013-10-11 / USD 39.99

Master Python and become a programmer-even if you never thought you could! This breakthrough book and CD can help practically anyone get started in programming. It's called "The Hard Way," but it's re......一起来看看 《Learn Python the Hard Way》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具