基於枚舉類的策略模式實現


  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. 多說一點:在采用狀態機模式時,結合模板方法模式來組織父狀態和各子狀態,是一種較好的方式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM