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

    什么是策略模式?

    定义算法族。分别封装起来。让它们之间能够相互替换,此模式让算法的变化独立于使用算法的客户。

    策略模式有什么优点?

    能够动态的改变对象的行为。
    

    设计原则

    1.封装变化(找出应用中可能须要变化之处,把它们独立出来。不要和那些不须要变化的代码混在一起)
    2.多用组合,少用继承
    3.针对接口编程。不针对实现编程
    
    把一个类中常常改变或者将来可能改变的部分提取出来,作为一个接口。
    然后在基类中包括这个对象的实例,这样类的实例在执行时就能够任意调用实现了这个接口的类的行为。 
    
    策略模式属于对象行为型模式,主要针对一组算法,将每个算法封装到具有共同接口的独立的类中。从而使得它们能够相互替换。
    策略模式使得算法能够在不影响到client的情况下发生变化。

    通常。策略模式适用于当一个应用程序须要实现一种特定的服务或者功能,并且该程序有多种实现方式时使用。

    策略模式中有三个对象

    1.环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用
    2.抽象策略对象:它可由接口或抽象类来实现
    3.详细策略对象:它封装了实现同不功能的不同算法
    
    利用策略模式构建应用程序,能够依据用户配置等内容,选择不同有算法来实现应用程序的功能。
    详细的选择有环境对象来完毕。
    採用这样的方式能够避免因为使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。

    实例分析

    • 场景
    设计一个动作冒险游戏,游戏中有不同的角色和不同的武器,每种武器攻击方式和杀伤力都不一样,每一个角色都具有战斗的技能,在游戏中都能够换武器
    
    • 分析
    依据场景能够创建基类Role,该类中包括战斗fight()方法。还包括设置武器行为的方法setWeapon();(环境对象)
    创建武器行为接口,包括使用武器方法。不同的武器实现该接口。(抽象策略对象)
    不同的角色设置不同的武器行为子类对象(详细策略对象)
    
    • 类图
    DesignMode Study Note Url 1.jpg
    
    • 代码

    1.Role类

    package com.pattern.strategy.role;
    
    import com.pattern.strategy.weapon.IWeaponBehavior;
    
    public abstract class Role {
        IWeaponBehavior mWeaponBehavior;
    
        public void fight() {
            if (mWeaponBehavior != null) {
                mWeaponBehavior.useWeapon();
            }
        }
    
        public void setWeaponBehavior (IWeaponBehavior weaponBehavior) {
            mWeaponBehavior = weaponBehavior;
        }
    
        public abstract void move();
    }

    2.详细角色类--King。Queen..

    package com.pattern.strategy.role;
    
    import com.pattern.strategy.util.Tools;
    
    public class King extends Role {
    
        @Override
        public void move() {
            Tools.print("King move");
        }
    }
    package com.pattern.strategy.role;
    
    import com.pattern.strategy.util.Tools;
    
    public class Queen extends Role {
    
        @Override
        public void move() {
            Tools.print("Queen move");
        }
    
    }
    

    3.抽象策略对象接口-IWeaponBehavior

    package com.pattern.strategy.weapon;
    
    public interface IWeaponBehavior {
        public void useWeapon();
    }


    4.详细策略对象类,AxeBehavior(使用斧头)。KnifeBehavior(使用匕首),SwordBehavior(使用剑)

    package com.pattern.strategy.weapon;
    
    import com.pattern.strategy.util.Tools;
    
    public class AxeBehavior implements IWeaponBehavior {
    
        @Override
        public void useWeapon() {
            Tools.print("AxeBehavior");
        }
    }
    
    package com.pattern.strategy.weapon;
    
    import com.pattern.strategy.util.Tools;
    
    public class KnifeBehavior implements IWeaponBehavior {
    
        @Override
        public void useWeapon() {
            Tools.print("KnifeBehavior");
        }
    
    }
    package com.pattern.strategy.weapon;
    
    import com.pattern.strategy.util.Tools;
    
    public class SwordBehavior implements IWeaponBehavior {
    
        @Override
        public void useWeapon() {
            Tools.print("SwordBehavior");
        }
    
    }
    

    5.工具类Tools和測试类StrategyMode

    package com.pattern.strategy.util;
    
    public class Tools {
        public static void print(String info) {
            System.out.println(info);
        }
    }
    
    package com.pattern.strategy;
    
    import com.pattern.strategy.role.King;
    import com.pattern.strategy.role.Queen;
    import com.pattern.strategy.role.Role;
    import com.pattern.strategy.weapon.AxeBehavior;
    import com.pattern.strategy.weapon.KnifeBehavior;
    import com.pattern.strategy.weapon.SwordBehavior;
    
    public class StrategyMode {
        public static void main(String[] args) {
            Role role = new King();
            role.setWeaponBehavior(new AxeBehavior());
            role.fight();
            role.move();
            role.setWeaponBehavior(new SwordBehavior());
            role.fight();
    
            role = new Queen();
            role.setWeaponBehavior(new KnifeBehavior());
            role.fight();
            role.move();
        }
    }
    

    6.执行结果

    AxeBehavior
    King move
    SwordBehavior
    KnifeBehavior
    Queen move




  • 相关阅读:
    Android Gradle Plugin指南(五)——Build Variants(构建变种版本号)
    文件内容操作篇clearerr fclose fdopen feof fflush fgetc fgets fileno fopen fputc fputs fread freopen fseek ftell fwrite getc getchar gets
    文件操作篇 close creat dup dup2 fcntl flock fsync lseek mkstemp open read sync write
    嵌入式linux应用程序调试方法
    version control system:git/hg/subversion/cvs/clearcase/vss。software configruation management。代码集成CI:Cruisecontrol/hudson/buildbot
    最值得你所关注的10个C语言开源项目
    如何记录linux终端下的操作日志
    CentOS 5.5 虚拟机安装 VirtualBox 客户端增强功能
    sizeof, strlen区别
    C/C++嵌入式开发面试题
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/7088292.html
Copyright © 2011-2022 走看看