- 针对策略方法只有一种形式的情况,此时各策略的参数和返回值都一样,可以用一个策略接口来做抽象
/**
* 1.测试接口
*/
@RestController
@RequestMapping("/enum")
class EnumStrategyRest {
@GetMapping("/doSth/{name}")
public void doSth(@PathVariable String name) {
//执行策略
WorkerEnum.valueOf(name).getWorker().doSth();
}
}
/**
* 2.枚举类,用以注册策略对象
*/
@Getter
enum WorkerEnum {
//注册策略对象
M(new Man()),
W(new Woman());
private Worker worker;
WorkerEnum(Worker worker) {
this.worker = worker;
}
}
/**
* 3.策略接口,做策略的抽象
*/
interface Worker {
void doSth();
}
/**
* 4.策略实现
*/
class Man implements Worker {
@Override
public void doSth() {
System.out.println("男人------------");
}
}
/**
* 5.另一个策略实现类
*/
class Woman implements Worker {
@Override
public void doSth() {
System.out.println("女人===========");
}
}
- 对策略实现形式更多样的,可以采用模板方法模式来实现
/**
* 1.测试接口
*/
@RestController
@RequestMapping("/enum")
class EnumStrategyRest {
@GetMapping("/doSth/{name}")
public void doSth(@PathVariable String name) {
//执行策略
WorkerEnum workerEnum = WorkerEnum.valueOf(name);
switch (workerEnum) {
case M: {
workerEnum.getWorker().run();
break;
}
case W: {
workerEnum.getWorker().walk();
break;
}
default: {
break;
}
}
}
}
/**
* 2.枚举类,用以注册策略对象
*/
@Getter
enum WorkerEnum {
//注册策略对象
M(new Man()),
W(new Woman());
private People worker;
WorkerEnum(People worker) {
this.worker = worker;
}
}
/**
* 3.策略抽象模板
*/
abstract class People {
void run() {
throw new UnsupportedOperationException();
}
void walk() {
throw new UnsupportedOperationException();
}
}
/**
* 4.策略实现
*/
class Man extends People {
@Override
void run() {
System.out.println("跑--------");
}
}
/**
* 5.另一个策略实现类
*/
class Woman extends People {
@Override
void walk() {
System.out.println("走----------");
}
}
- 多说一点:在采用状态机模式时,结合模板方法模式来组织父状态和各子状态,是一种较好的方式。