什么是策略模式?

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

 

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

 

流程图:

 

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