zoukankan      html  css  js  c++  java
  • 基于枚举类的策略模式实现

    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. 多说一点:在采用状态机模式时,结合模板方法模式来组织父状态和各子状态,是一种较好的方式。
    学习使我充实,分享给我快乐!
  • 相关阅读:
    程序活动记录&程序调试&多线程编程
    数据结构与算法
    C/C++
    Information Retrieval --- Retrieval Comment
    Information Retrieval --- Clustering
    Information Retrieval --- Classification
    Information Retrieval --- Web Search
    Information Retrieval --- Retrieval Enforce:Relevance Feedback & Query Expansion
    Information Retrieval --- Retrieval Model
    ubuntu server 安装vnc
  • 原文地址:https://www.cnblogs.com/JaxYoun/p/13551470.html
Copyright © 2011-2022 走看看