策略模式
来源:互联网 发布:粒子滤波算法及其应用 编辑:程序博客网 时间:2024/06/06 17:03
文章来自:http://www.myopenresources.com/page/resource_detail_1.html?rid=287 更多文章请进入:我的开源网
策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类,各种算法在具体的策略类中提供。由于算法和环境独立开来,算法的增减,修改都不会影响到环境和客户端。
策略模式的组成:
1.抽象策略角色:策略类,通常由一个接口或者抽象类实现
2.具体策略角色:包装了相关的算法和行为
3.环境角色:持有一个策略类的引用,最终给客户端调用的。
策略模式的编写步骤:
1.对策略对象定义一个公共接口
2.编写策略类,该类实现了上面的公共接口
3.在使用策略对象的类中保存一个对策略对象的引用
抽象策略角色:
package com.cjh.strategy;
/**
* 策略公共接口(武器接口)
*
* @author cjh
*
*/
public interface WeaponBehavior {
/**
* 使用武器方法
*
* @return
*/
public String useWeapon();
}
具体策略角色1:
package com.cjh.strategy.impl;
import com.cjh.strategy.WeaponBehavior;
/**
* 策略实现(斧头类)
*
* @author cjh
*
*/
public class AxeBehavior implements WeaponBehavior {
/**
* 使用的武器方法
*/
@Override
public String useWeapon() {
return "斧头";
}
}
具体策略角色2:
package com.cjh.strategy.impl;
import com.cjh.strategy.WeaponBehavior;
/**
* 策略实现(弓箭类)
*
* @author cjh
*
*/
public class BowAndArrowBehavior implements WeaponBehavior {
/**
* 使用的武器方法
*/
@Override
public String useWeapon() {
return "弓箭";
}
}
具体策略角色3:
package com.cjh.strategy.impl;
import com.cjh.strategy.WeaponBehavior;
/**
* 策略实现(匕首类)
*
* @author cjh
*
*/
public class KinfeBehavior implements WeaponBehavior {
/**
* 使用的武器方法
*/
@Override
public String useWeapon() {
return "匕首";
}
}
具体策略角色4:
package com.cjh.strategy.impl;
import com.cjh.strategy.WeaponBehavior;
/**
* 策略实现(宝剑类)
*
* @author cjh
*
*/
public class SwordBehavior implements WeaponBehavior {
/**
* 使用的武器方法
*/
@Override
public String useWeapon() {
return "宝剑";
}
}
抽象环境角色:
package com.cjh.environment;
import com.cjh.strategy.WeaponBehavior;
/**
* 环境角色(角色抽象类)
*
* @author cjh
*
*/
public abstract class Character {
/**
* 持有策略公共接口的引用
*/
private WeaponBehavior weapon;
/**
* 策略get方法
*
* @return
*/
public WeaponBehavior getWeapon() {
return weapon;
}
/**
* 策略set方法
*
* @param weapon
* 策略引用
*/
public void setWeapon(WeaponBehavior weapon) {
this.weapon = weapon;
}
/**
* 环境角色方法具体由子类实现
*/
public abstract void fight();
}
环境角色1:
package com.cjh.environment.impl;
import com.cjh.environment.Character;
/**
* 环境角色实现(国王角色类)
*
* @author cjh
*
*/
public class King extends Character {
/**
* 环境角色方法实现
*/
@Override
public void fight() {
System.out.println("国王使用了" + this.getWeapon().useWeapon());
}
}
环境角色2:
package com.cjh.environment.impl;
import com.cjh.environment.Character;
/**
* 环境角色实现(武士角色类)
*
* @author cjh
*
*/
public class Knight extends Character {
/**
* 环境角色方法实现
*/
@Override
public void fight() {
System.out.println("武士使用了"+this.getWeapon().useWeapon());
}
}
环境角色3:
package com.cjh.environment.impl;
import com.cjh.environment.Character;
/**
* 环境角色实现(女王)
*
* @author cjh
*
*/
public class Queen extends Character {
/**
* 环境角色方法实现
*/
@Override
public void fight() {
System.out.println("女王使用了"+this.getWeapon().useWeapon());
}
}
环境角色4:
package com.cjh.environment.impl;
import com.cjh.environment.Character;
/**
* 环境角色实现(巨魔角色类)
*
* @author cjh
*
*/
public class Troll extends Character {
/**
* 环境角色方法实现
*/
@Override
public void fight() {
System.out.println("巨魔使用了"+this.getWeapon().useWeapon());
}
}
最终用户:
package com.cjh.client;
import com.cjh.environment.impl.King;
import com.cjh.environment.impl.Knight;
import com.cjh.environment.impl.Queen;
import com.cjh.environment.impl.Troll;
import com.cjh.strategy.WeaponBehavior;
import com.cjh.strategy.impl.AxeBehavior;
import com.cjh.strategy.impl.BowAndArrowBehavior;
import com.cjh.strategy.impl.KinfeBehavior;
import com.cjh.strategy.impl.SwordBehavior;
/**
* 最终用户类
*
* @author cjh
*
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println("------默认武器------\n");
WeaponBehavior weapon = new AxeBehavior();
King king = new King();
king.setWeapon(weapon);
king.fight();
System.out.println("-----------");
weapon = new KinfeBehavior();
Queen queen = new Queen();
queen.setWeapon(weapon);
queen.fight();
System.out.println("-----------");
weapon = new SwordBehavior();
Knight knight = new Knight();
knight.setWeapon(weapon);
knight.fight();
System.out.println("-----------");
weapon = new BowAndArrowBehavior();
Troll troll = new Troll();
troll.setWeapon(weapon);
troll.fight();
System.out.println("\n------更换武器------\n");
king.setWeapon(weapon);
king.fight();
}
}
文章来自:http://www.myopenresources.com/page/resource_detail_1.html?rid=286 更多文章请进入:http://www.myopenresources.com/
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 禁用宏则关闭excel文件
- 用VBA宏自动改变Excel宏安全级别设…
- performSelector详解
- EXCEL VBA MD5 简单加密
- 解决win7 64位系统不能识别4G内存…
- 策略模式
- Mono Touch文件下载
- EXCEL VBA 跨表合并多个文件
- EXCEL常用基础公式及操作
- WLAN DRIVE
- EXCEL中VBA禁止与启用快捷键
- 网上邻居无法访问本机及打印机之解…
- Git Ubuntu下安装
- 通过修改注册表来修改默认浏览器