• 夜话JAVA设计模式之策略模式


    策略模式
        定义了算法簇,分别封装起来,让他们之间可以互相替换,让算法簇的变化独立于使用算法的客户。
    设计原则1
        找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
    设计原则2
        针对接口编程,而不是针对实现编程。
    设计原则3
        多用组合,少用继承。

    下面简单的代码描述了不同的角色用武器加入战斗,同时它们也可以切换武器。

    话不多说,直接撸代码


    1.角色抽象类BaseCharacter

    /**
     * 角色抽象类
     * @author monkjavaer
     * @date 2018/08/18 10:35
     */
    public abstract class BaseCharacter {
    
        WeaponBehavior weaponBehavior;
    
        public BaseCharacter(){
    
        }
    
        /**
         * 切换武器
         * @param weaponBehavior
         */
        public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
            System.out.println("set weapon");
            this.weaponBehavior = weaponBehavior;
        }
    
        /**
         * 用不同武器战斗
         */
        public abstract void fight();
    
        /**
         * 所有继承这个抽象类的都可以说hello
         */
        public void sayHello(){
            System.out.print("hello!");
        }
    }
    

      

    1.1国王继承角色

    /**
     * @author monkjavaer
     * @date 2018/08/18 11:30
     */
    public class King extends BaseCharacter{
    
        public King() {
            weaponBehavior = new KnifeBehavior();
        }
    
        @Override
        public void fight(){
            System.out.print("king fight:");
            weaponBehavior.useWeapon();
        }
    }
    

      

    1.2皇后类继承角色

    /**
     * @author monkjavaer
     * @date 2018/08/18 11:32
     */
    public class Queen extends BaseCharacter {
    
        public Queen() {
            weaponBehavior = new KnifeBehavior();
        }
    
        @Override
        public void fight() {
            System.out.print("Queen fight:");
            weaponBehavior.useWeapon();
        }
    }
    

      

    2.武器接口WeaponBehavior

    /**
     * 武器接口
     * @author monkjavaer
     * @date 2018/08/18 10:38
     */
    public interface WeaponBehavior {
        /**
         * 使用武器
         */
        void useWeapon();
    }
    

      

    2.1匕首类实现武器接口

    /**
     * 匕首
     * @author monkjavaer
     * @date 2018/08/18 11:36
     */
    public class KnifeBehavior implements WeaponBehavior {
        @Override
        public void useWeapon() {
            System.out.println("use Knife");
        }
    }
    

      

    2.2宝剑实现武器接口

    /**
     * 宝剑
     * @author monkjavaer
     * @date 2018/08/18 11:35
     */
    public class SwordBehavior implements WeaponBehavior {
        @Override
        public void useWeapon() {
            System.out.println("use Sword");
        }
    }
    

      

    测试类

    public static void main(String[] args) {
    
        BaseCharacter king = new King();
        king.sayHello();
        king.fight();
        king.setWeaponBehavior(new SwordBehavior());
        king.fight();
    
        BaseCharacter queen = new Queen();
        queen.fight();
    }
    

      

  • 相关阅读:
    [HAOI2008]糖果传递
    [HAOI2008]木棍分割
    [HAOI2008]硬币购物
    [ZJOI2008]泡泡堂
    [JSOI2007]建筑抢修
    [JSOI2007]麻将
    [Note]prufer
    [BZOJ3275]Number
    [POI2014]RAJ-Rally
    [JSOI2010]快递服务
  • 原文地址:https://www.cnblogs.com/monkjavaer/p/9569262.html
Copyright © 2020-2023  润新知