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. 多说一点:在采用状态机模式时,结合模板方法模式来组织父状态和各子状态,是一种较好的方式。
    学习使我充实,分享给我快乐!
  • 相关阅读:
    Flink Application Development DataStream API Execution Mode (Batch/Streaming)- Flink应用程序开发DataStream API执行模式(批/流)
    Flink Application Development DataStream API Overview
    Flink Concept Stateful Stream Processing -Flink概念有状态流处理
    Hdfs原理
    Leetcode 763 划分字母区间
    406. 根据身高重建队列
    贝叶斯统计概要(待修改)
    蒙特卡罗方法
    马尔科夫链蒙特卡罗方法(MCMC)
    Leetcode452. 用最小的箭引爆气球
  • 原文地址:https://www.cnblogs.com/JaxYoun/p/13551470.html
Copyright © 2011-2022 走看看