• Java设计模式菜鸟系列(一)策略模式建模与实现


    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39721563


    今天開始咱们来谈谈Java设计模式。

    这里会结合uml图形来解说,有对uml建模不熟的能够參考我的还有一篇博文uml建模

    首先。个人认为模式的设计就是一个将变化的东西和不变(稳定)的东西分离的过程。

    咱们的应用中可能有非常多须要改变的地方,而模式要做的就是把它们“抽取”出来并进行“封装”和“实现”,因此很多其它的时候咱们是面向接口编程。

    以下将结合《Head First 设计模式》这一书中的某些详细案例以及本人的理解进行解说。

    假设大家透过看图能说出是哪种模式并能进行详细的代码实现及加以应用。反之也能做到,那么我想关于Java这些常见的设计模式你也就掌握的几乎相同了。


    关于策略模式。网上有的说法是:策略模式让用户能够选择运行一个动作的方法,也就是说,用户能够选择不同的策略来进行操作。个人认为策略模式能够用这个公式:不同的XXX 拥有不同的XXX供用户选择。比方说:不同的象棋棋子拥有不同的走法供用户选择。


    以下依据游戏中的不同人物拥有不同武器供用户选择的简单案例:

    一、UML模型图

    二、代码实现

    /**
     * 武器 --模板
     */
    interface WeaponBehavior {
    	void useWeapon();
    }
    
    class KnifeBehavior implements WeaponBehavior {
    	@Override
    	public void useWeapon() {
    		System.out.println("实现用匕首刺杀...");
    	}
    }
    
    class BowAndArrowBehavior implements WeaponBehavior {
    	@Override
    	public void useWeapon() {
    		System.out.println("实现用弓箭设计...");
    	}
    }
    
    class AxeBehavior implements WeaponBehavior {
    	@Override
    	public void useWeapon() {
    		System.out.println("实现用斧头劈砍...");
    	}
    }
    
    class SwordBehavior implements WeaponBehavior {
    	@Override
    	public void useWeapon() {
    		System.out.println("实现用宝剑挥舞...");
    	}
    }
    
    /**
     * 角色
     */
    abstract class Character {
    	// 将接口作为抽象角色的Field以便封装
    	protected WeaponBehavior weaponBehavior;
    
    	public void setWeapon(WeaponBehavior w) {
    		weaponBehavior = w;
    	}
    
    	/**
    	 * 这里有点相似“代理模式”
    	 */
    	public void performWeapon() {
    		// do something...
    		weaponBehavior.useWeapon();
    		// do something...
    	}
    
    	public abstract void fight();
    }
    
    /**
     * 国王使用宝剑挥舞
     */
    class King extends Character {
    
    	public King() {
    		weaponBehavior = new SwordBehavior();
    	}
    
    	@Override
    	public void fight() {
    		System.out.println("国王使用宝剑挥舞...");
    	}
    
    }
    
    /**
     * 皇后使用匕首刺杀
     */
    class Queen extends Character {
    
    	public Queen() {
    		weaponBehavior = new KnifeBehavior();
    	}
    
    	@Override
    	public void fight() {
    		System.out.println("皇后使用匕首刺杀...");
    	}
    
    }
    
    /**
     * Knight和Troll以此类推。这里就不写了
     */
    
    /**
     * client測试
     * 
     * @author Leo
     */
    public class Test {
    	public static void main(String[] args) {
    		Character king = new King();
    		king.performWeapon();
    		// 这里有点相似于“状态模式”
    		king.setWeapon(new AxeBehavior());
    		king.performWeapon();
    
    		Character queen = new Queen();
    		queen.performWeapon();
    		queen.setWeapon(new BowAndArrowBehavior());
    		queen.performWeapon();
    	}
    }

    三、应用场景(仅代表个人观点)

    游戏中的角色武器、棋类游戏中的棋子走法等。

    四、小结

      以上内容假设有不同的见解或疏忽的地方,还请大家提出宝贵的建议或意见。


    最后大家能够试着将以下的uml模型进行详细的代码实现,如图:附源代码



  • 相关阅读:
    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED解决方法
    Ubuntu 修改host并重启网络
    Ubuntu批量修改权限
    win10 vm 11 桥接模式配置
    Ubuntu获取root 权限,开机自动登入root
    ptxas fatal : Unresolved extern function Error 255
    Ubuntu 16.04 LTS安装 TeamViewer
    SSD win7优化步骤
    正则表达式
    C语言中,float在内存中的储存方式
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7141704.html
Copyright © 2020-2023  润新知