基于枚举类的策略模式实现

  1. 针对策略方法只有一种形式的情况,此时各策略的参数和返回值都一样,可以用一个策略接口来做抽象
/**
 * 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. 对策略实现形式更多样的,可以采用模板方法模式来实现
/**
 * 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("走----------");
    }
}
  1. 多说一点:在采用状态机模式时,结合模板方法模式来组织父状态和各子状态,是一种较好的方式。
posted @ 2020-08-23 23:46  JaxYoun  阅读(2448)  评论(0编辑  收藏  举报