博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式——策略模式(Strategy Pattern)
阅读量:5290 次
发布时间:2019-06-14

本文共 2602 字,大约阅读时间需要 8 分钟。

策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

先不管定义是如何,让我们先来看一个例子。假设你要设计一个游戏里的人物(包括玩家、NPC),如何进行设计呢?我们知道,一个游戏人物肯定有基本属性、动作(如血量的属性、行走的动作),能够拿不同的武器,能够换不同的装备......如何进行弹性的设计。在这里,我们就可以使用策略模式。

设计原则1:找出应用之中可能变化之处,把它们独立出来,不要和那些不要变化的代码混在一起在这里,我们可以看到游戏人物可以拿不同的武器, 能够换不同的装备,属于变化的部分,可以独立出来;行走的动作等属于不变的部分,可以不需独立出来,可以先实现为一个类。

基本人物代码:

public class GamePerson{    private int bloodValue;    public GamePerson(int value){        this.bloodValue=value;    }    public int getBloodValue(){        return bloodValue;    }        private void move(){        System.out.println("I'm moving");    }}

  

现在我们考虑的是如何实现装备、武器等的实现,使其能够具有弹性,在游戏时动态改变。所以,就需要设计原则2:针对接口编程,而不是针对实现编程。利用接口表示每个行为,比如EquipmentInterface,WeaponInterface.我们不用GamePerson实现这两个接口,而是自己创建具体的装备类、武器类实现各自的接口。如:ClothingEquipmentWristEquipment,SwordWeapton,GunWeapton.

具体代码如下:

装备接口:

public interface EquipmentInterface{    void equipment();}

衣服装备:

public class ClothingEquipment implement EquipmentInterface{    public void equipment(){         Systemout.out.println("I'm clothing");           }  }

手腕装备

public class WristEquipment implement EquipmentInterface{    public void equipment(){         Systemout.out.println("I'm wrist");           }  }

武器接口

public interface WeaptonInterface{      void weapton();  }

刀剑武器

public class SwordWeapton implement WeaptonInterface{     void weapton(){        System.out.println("I'm sword");    }  }

枪武器

public class GunWeapton implement WeaptonInterface{     void weapton(){        System.out.println("I'm gun");    }  }

好,最后我们就需要将这两个组合在一起了。具体的说,需要在游戏人物中加入WeaptonInterface与EquipmentInterface。如下:

public class GamePerson{    private int bloodValue;     WeaptonInterface weapton;    EquipmentInterfac equipment;
public void setWeapton(WeaptonInterface w){        this.weapton = w;    }
public void setEquipment(EquipmentInterface w){        this.equipment = w;    }
public GamePerson(int value,WeaptonInterface w,EquipmentInterface e){        this.bloodValue=value;      this.weapton = w;      this.equipment =e;     }    public int getBloodValue(){        return bloodValue;    }        private void move(){        System.out.println("I'm moving");    }}

所以,具体的人物类可以继承GamePerson,如:

public class NPCPerson extends GamePerson{    public void NPCPerson(int b,WeaptonInterface w,EquipmentInterface e){      super(b,w,e);          }      }

测试一下:

public class TestApp{    public static void main(String[] args){        NPCPerson p = new NPCPerson(100,new SwordWeapton(),new WristWeapton());        p.move();        p.setWeapton(new GunWeapton());     }}

在最后需要记住设计原则3:多用组合,少用继承

 

转载于:https://www.cnblogs.com/Villager/p/4362447.html

你可能感兴趣的文章
php 前端获取数据
查看>>
java中自定义注释@interface的用法
查看>>
Python笔记-字符串
查看>>
关于导航栏的六个小技巧
查看>>
(转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信...
查看>>
【CODEFORCES】 D. CGCDSSQ
查看>>
git 不输入用户名和密码指令
查看>>
利用javascrit获取url传递的参数
查看>>
第四周总结
查看>>
关于dom节点绑定滑动事件导致浏览器上下滑动失效解决方案--黄丕巧
查看>>
玫瑰花 星星
查看>>
building Utils {{ant+ivy}、{maven}}怎么样手动将下载下来的 JAR 包添加到 Maven、ivy 的本地仓库...
查看>>
HTML格式布局
查看>>
hibernate generator 的使用
查看>>
微信公众号PHP生成二维码海报的几个小扩展
查看>>
MySQL 导出用户权限
查看>>
缓存穿透、缓存雪崩和缓存预热
查看>>
php正则表达式以及正则函数详解
查看>>
1012 数字分类 (20 分)
查看>>
ios实现二维码扫描
查看>>