zoukankan      html  css  js  c++  java
  • JAVA设计模式之策略模式

    1、初步认识:

       策略模式的定义:

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

       大白话:

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

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

       1、R1895消音左轮一把;

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

       3、AWM狙击步枪一把;

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

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

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

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

       五连发,游戏结束。

    2、策略模式的结构图:

      

    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();
    } }
    复制代码

    输出结果:

     

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

    • 重点在于:给对象传入什么样的策略,就执行什么样的动作。
    • 优点在于:可以轻易的扩展与改变策略,可以动态改变对象的行为。
    • 缺点在于:客户端必须知道所有的策略类,并自行决定使用哪一种。每个具体的策略都会产生一个新类,这样会造成很多策略类。
  • 相关阅读:
    网络安全分析
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1540 机器
    java实现 洛谷 P1540 机器
  • 原文地址:https://www.cnblogs.com/shoshana-kong/p/10759337.html
Copyright © 2011-2022 走看看