zoukankan      html  css  js  c++  java
  • java策略模式

    什么是策略模式?

    官方曰:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化;

    俗话曰:策略模式定义了一系列具有共同特征对象的某些行为(方法/函数),广义上来看,每个方法都是完成相同的工作,实际上每个方法执行的细节不一样,也就是具体实现不同,比方说:人吃饭这个行为,中国人用筷子和碗吃饭,而美国人用的是叉子和盘子吃饭,也有用竹筒盛饭吃的。。。。。。大家都是实现吃饭这个行为;而软件系统中为了减少具有共同特征和行为的对象之间的耦合度,实现对外统一对象的特征(方法),还是拿吃饭来说(本人好吃^_^,见谅):对外统一暴露吃饭方法,具体谁吃(也可以理解成中国人方式吃、还是美国人方式吃),那就是策略模式的核心所在,这个时候就需要策略管理器去动态调用具体方法实现了;就不说太多废话了,看例子:

    流程图:

    JAVA_CODE例子:

    /**
     * 人类
     * 对外统一入口
     * @author Administrator
     *
     */
    public interface Person {
        //吃饭
        public void eat();
    }
    /**
     * 鬼子
     * @author Administrator
     */
    @Component
    public class JapanPerson implements Person {
        @Override
        public void eat() {
            System.out.println("米西米西");
        }
    }
    /**
     * 中国人
     * @author Administrator
     *
     */
    @Component
    public class ChinesePerson implements Person {
        @Override
        public void eat() {
            System.out.println("中国人在吃饭!");
        }
    }
    /**
     * 米国人
     * @author Administrator
     */
    @Component
    public class AmericanPerson implements Person {
        @Override
        public void eat() {
            System.out.println("米国人在吃饭!");
        }
    }
    /**
     * 人类策略管理器
     * @author Administrator
     *
     */
    @Component
    public class PersonContext {
        
        /** 
         *使用线程安全的ConcurrentHashMap存储所有实现Person接口的Bean 
         *key:beanName 
         *value:实现Person接口Bean 
         */  
        private final Map<String, Person> personMap = new ConcurrentHashMap<>();
        
        
        /**
         * 注入所有实现Person的bean,全部存放personMap中,以实现动态调用
         * @param personMap
         */
        @Autowired
        public PersonContext(Map<String, Person> personMap) {  
            this.personMap.clear();  
            this.personMap.putAll(personMap);
        }  
        
        //行为方法
        public void doEat(String value) {  
            if(!StringUtils.isEmpty(value)){  
                personMap.get(value).eat();  
            }  
        }
    }
    @Controller
    public class PersonController {
        
        @Autowired
        private PersonContext personContext;
        
        
        @RequestMapping("eat")  
        public @ResponseBody void eat(String value) {  
            personContext.doEat(value);  
        }
    }

    这样就可以实现动态调用,例如启动tomcat后访问: http://127.0.0.1:8080/item/eat?value=chiniesePerson就是调用中国人的吃饭行为;

    总结: 策略模式有效的解决了具有共同行为的对象之间的耦合,这样才符合"对修改关闭,扩展开放"原则;

    以下图是本人项目的具体应用场景,各位可以参考

    -----------------------------------------------------------------------------------

    本文仅供学习,如有不对地方,请留言指教!

    了解更多设计模式:https://www.cnblogs.com/foryang/p/5849402.html

  • 相关阅读:
    ORM和JDBC
    四种会话跟踪技术以及jstl介绍
    GC、进程和线程的定义
    数组和链表的理解,及各自的优缺点
    JSP和Servlet及浏览器与tomcat交互过程
    多线程、同步实现方法及Error和Exception的区别与联系
    Eclipse创建一个普通maven项目详细步骤
    Eclipse创建一个动态maven项目详细步骤
    Myeclipse项目出现红叉解决方案
    数据结构和算法 — 平衡二叉树的实现
  • 原文地址:https://www.cnblogs.com/whqworld/p/9156412.html
Copyright © 2011-2022 走看看