- 針對策略方法只有一種形式的情況,此時各策略的參數和返回值都一樣,可以用一個策略接口來做抽象
/**
* 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("走----------");
}
}
- 多說一點:在采用狀態機模式時,結合模板方法模式來組織父狀態和各子狀態,是一種較好的方式。