背景:
上下文设计模式用的非常之多。
比如:属性系统,每个人都有自己的属性培养。
战斗系统:需要达到一定的条件触发某个东西。
AI系统:达到某个条件触发某个行为。
技能系统:比如:LOL中派克的R,达到血量后,直接斩杀。
这里主要是战斗系统为例子。
--------------------------
还有一点感受就是:看别人的代码写的再清晰简单,如果自己不亲自写一遍,那么依然是麻瓜,所以,一定要仿写demo,然后到实际项目中,再逐步优化。
1)上下文
IContext.java
笔记: 这里以:Player为例子,实际可能还有怪物,Boss等,他们的属性不一样,我们可以把接口都写到里面,然后在枚举里面再进行分类也行。
package org.example.context.context;
/**
* 上下文对象的封装
*/
public interface IContext {
default int getAge() {
return 0;
}
default int getScore() {
return 0;
}
default String getName() {
return "";
}
}
Player.java
package org.example.context.context;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class Player implements IContext {
private int age;
private int score;
private String name;
@Override
public int getAge() {
return age;
}
@Override
public int getScore() {
return score;
}
@Override
public String getName() {
return name;
}
}
2)条件
ICondition.java
package org.example.context.conditions;
import org.example.context.context.IContext;
public interface ICondition {
boolean check(IContext context);
}
ECondition.java
package org.example.context.conditions;
import lombok.Getter;
@Getter
public enum ECondition {
CHENG_REN(1, new AgeCondition(), ">18岁"),
NAME_CONTAION_ZHAO(2, new NameCondition(), "名字含有赵"),
SCORE_JIGE(3, new ScoreCondition(), "成绩大于60分"),
;
private int type;
private ICondition condition;
private String desc;
ECondition(int type, ICondition condition, String desc) {
this.type = type;
this.condition = condition;
this.desc = desc;
}
}
AgeConditon.java
package org.example.context.conditions;
import org.example.context.context.IContext;
public class AgeCondition implements ICondition{
@Override
public boolean check(IContext context) {
return context.getAge() >= 18;
}
}
NameConditon.java
package org.example.context.conditions;
import org.example.context.context.IContext;
public class NameCondition implements ICondition {
@Override
public boolean check(IContext context) {
return context.getName().contains("赵");
}
}
ScoreCondition.java
package org.example.context.conditions;
import org.example.context.context.IContext;
public class ScoreCondition implements ICondition {
@Override
public boolean check(IContext context) {
return context.getScore() > 60;
}
}
测试:
package org.example.context;
import com.google.common.collect.Lists;
import org.example.context.conditions.ECondition;
import org.example.context.context.IContext;
import org.example.context.context.Player;
import java.util.List;
public class Main {
public static void main(String[] args) {
IContext context1 = new Player(30, 80, "张三");
IContext context2 = new Player(18, 10, "赵紫龙");
IContext context3 = new Player(5, 70, "李冰冰");
List list = Lists.newArrayList(context1, context2, context3);
for (IContext context : list) {
for (ECondition eCondition : ECondition.values()) {
boolean check = eCondition.getCondition().check(context);
System.out.println(eCondition.getDesc() + ":" + check);
}
System.out.println("----------------");
}
}
}
/*
>18岁:true
名字含有赵:false
成绩大于60分:true
----------------
>18岁:true
名字含有赵:true
成绩大于60分:false
----------------
>18岁:false
名字含有赵:false
成绩大于60分:true
----------------
*/