美文网首页
设计模式-策略模式

设计模式-策略模式

作者: Wynne丶XXW | 来源:发表于2018-03-16 16:44 被阅读0次

    emmm.. 什么叫策略模式呢? 我接下会来通过吃鸡的武器来给大家讲解,以便于大家理解什么是策略模式

    策略模式的定义

    策略模式是一种面向接口编程,让每一个接口互相没有关联,却可以互相替换。也可以相当于说一种行为与算法

    UML类图

    enter image description here
    • Arsenat 上下文类,用来实现与替换策略(相当于Android中常用的BaseActivity)
    • Weapon 策略的抽象类
    • WeaponM16A4,WeaponM416 抽象的具体事例类

    具体代码实现

    在我们吃鸡的时候,我们跳伞之后会拾取到很多武器,这些武器有一个共同的特点就是 都能开枪射击(shoot),但是我们角色(Arsenat)有时候一局游戏中可能会更换(setWeapon)很多种武器, 但是开枪一个特征所有武器都是持有的. 从策略模式的角度来分析的话,我们更换武器 只需更换武器的引用,这就是上面所说面向接口编程 会降低耦合 方便之后扩展

    策略抽象Weapon

    public interface Weapon {
        /**
         * 射击
         */
        void shoot();
    }
    

    策略实例WeaponXXX

    public class WeaponAKM implements Weapon {
        @Override
        public void shoot() {
            System.out.println("AKM 击杀了 xxx");
        }
    }
    
    public class WeaponM16A4 implements Weapon {
        @Override
        public void shoot() {
            System.out.println("M16A4 击杀了 xxx");
        }
    }
    

    Arsenat

     public class Arsenat {
    
        private Weapon mWeapon;
    
        public Arsenat(Weapon mWeapon) {
            this.mWeapon = mWeapon;
        }
    
        public void setWeapon(Weapon weapon) {
            mWeapon = weapon;
        }
    
    
        public void action() {
            mWeapon.shoot();
        }
    }
    

    运行

    public static void main(String[] args) {
            Arsenat arsenat = new Arsenat(new WeaponAKM());
            //击杀
            arsenat.action();
            //舔包 换武器
            arsenat.setWeapon(new WeaponM16A4());
            arsenat.action();
            }
    
     //Log
    
    AKM 击杀了 xxx
    M16A4 击杀了 xxx
    

    总结

    通过简单的代码实例,我们基本能够理解什么是策略模式,代码虽然非常简单,但是设计模式是一种思想,我们要学会如果运用这种思想到平常的编码提高我们的设计和架构能力。

    策略模式
    优点: 对于较为复杂的业务逻辑显得更为直观,扩展也更为方便
    缺点: 如果策略过多,子类相对就回比较臃肿,如果需要大量子类,谨慎使用

    Demo地址

    参考资料

    Android设计模式源码解析之策略模式

    Head First 设计模式

    相关文章

      网友评论

          本文标题:设计模式-策略模式

          本文链接:https://www.haomeiwen.com/subject/xqrrqftx.html