设计模式之----策略模式
1、策略模式概要
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
这个模式涉及到三个角色:
● **环境(Context)角色:**持有一个Strategy的引用。
● **抽象策略(Strategy)角色:**这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
● **具体策略(ConcreteStrategy)角色:**包装了相关的算法或行为。
在我看来策略模式就是可以通过设计出一个接口,来不断更换内容。
就比如说是墙上的插头,你只要设计为3口插头,或者两口的插头,你就可以插上使用,插口并不需要知道你是什么
2、策略模式案例代码
策略模式上下文
public class Context {
//持有一个具体策略的对象
private Strategy strategy;
/**
* 构造函数,传入一个具体策略对象
* @param strategy 具体策略对象
*/
public Context(Strategy strategy){
this.strategy = strategy;
}
/**
* 策略方法
*/
public void contextInterface(){
strategy.algorithmInterface();
}
}
抽象策略类
public interface Strategy {
/**
* 策略方法
*/
public void algorithmInterface();
}
具体策略类
public class ConcreteStrategyA implements Strategy {
@Override
public void algorithmInterface() {
//相关的业务
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public void algorithmInterface() {
//相关的业务
}
}
public class ConcreteStrategyC implements Strategy {
@Override
public void algorithmInterface() {
//相关的业务
}
}
3、策略模式举例
现在我们是一款网络游戏的开发者,我们需要开发一个角色,他能够携带武器
携带不同的武器能够拥有不同的技能
比如:刀(劈砍)、弓箭(精准射击)、狙击枪(远程狙击)
我们所需要实现的是,可以动态的更换武器,并且释放技能
好了,确定需求后,我们就运用策略模式开始设计
①首先设计武器接口,既策略方法
public interface WeaponInterface {
void attack();
}
②设计武器接口实现类,既具体策略类
public class Bow implements WeaponInterface {
@Override
public void attack() {
System.out.println("这里是弓箭,释放技能:精准射击");
}
}
public class Gun implements WeaponInterface {
@Override
public void attack() {
System.out.println("这里是枪,释放技能:远程狙击");
}
}
public class Sword implements WeaponInterface {
@Override
public void attack() {
System.out.println("这里是刀,释放技能:劈砍");
}
}
③实现人物类,既策略对象
public class Npc {
private String name;
WeaponInterface weaponInterface; // 调用策略方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setWeaponInterface(WeaponInterface weaponInterface) {
this.weaponInterface = weaponInterface;
}
public void attack(){
System.out.println("我是"+ name);
weaponInterface.attack();
}
}
④测试类
public class Main {
public static void main(String[] args) {
// 初始化三种武器接口
Sword sword = new Sword();
Gun gun = new Gun();
Bow bow = new Bow();
Npc npc = new Npc();
npc.setName("小王");
npc.setWeaponInterface(sword); // 装备武器刀
npc.attack();
npc.setWeaponInterface(gun); // 装备枪
npc.attack();
npc.setWeaponInterface(bow); //装备弓箭
npc.attack();
}
}
最后控制台显示为
最后实现了通过改变武器,来使人物的攻击不同