策略模式java源代码 java策略模式优化ifelse

java源码中应用哪些设计模式3种工厂模式 单例模式 策略模式 用的都很多 其实实际开发中用的最多的还是工厂和单例,其余的根本没用过 。
Java中,状态模式和策略模式的区别策略模式通过封装一组相关算法 , 为Client提供运行时的灵活性 。Client可以在运行时,选择任一算法,而不改变使用算法的Context 。一些流行的策略模式的例子是写那些使用算法的代码,例如加密算法、压缩算法、排序算法 。另一方面,状态模式允许对象,在不同的状态拥有不同的行为 。因为现实世界中的对象通常都是有状态的,所以在不同状态 , 行为也不一样 。例如 , VM(自动售货机)只在hasCoin状态才给吐商品;不投币 , 是不会吐的 。现在可以清楚的看出不同之处了:意图是不同的 。状态模式帮助对象管理状态 , 而策略模式允许Client选择不同的行为 。
另一个不那么容易能看出来的区别是:是谁促使了行为的改变 。策略模式中,是Client提供了不同的策略给Context;状态模式中,状态转移由Context或State管理 。另外,如果在State中管理状态转移,那么必须持有Context的引用 。例如,在VM的例子中,State对象需要调用VM的setState()方法去改变的状态 。另一方面 , Strategy从不持有Context的引用,是Client把所选择的Strategy传递给Context 。由于状态模式和策略模式的区别 , 是流行的Java设计原则类面试题之一,将会在本文探讨在Java中,状态模式和策略模式的异同,这可以加深理解 。
(1)相似之处
看看状态模式和策略模式的UML图,就会发现结构非常相似 。使用State对象改变自己行为的对象被称为Context对象;相似的,使用Strategy对象改变自己行为的对象叫Context对象 。记住,Client和Context打交道 。在状态模式中 , Context把方法调用委托给当前的状态对象 , 而在策略模式中,Context使用的Strategy对象,是被当做参数传递过来的 , 或在Context对象被创建时就被提供的 。
这是专为经典的VM问题而设计的状态模式UML类图 。可以看出 , VM的状态是个接口,表示不同状态的具体实现 。每一个状态都持有Context的引用,用来管理由Context触发的行为导致的状态转移 。
这是专为实现排序功能而设计的策略模式UML类图 。因为存在很多排序算法 , 该模式让Client在排序时选择适当的算法 。事实上,Java的集合框架就使用这个模式,实现了用来排序的Collections.sort()方法 。不同的是,不允许Client选择排序算法,而是让传递Comparator或Comparable接口的实例来指定比较策略 。
(2)不同之处
策略模式封装了一组相关算法,允许Client在运行时使用可互换的行为;状态模式帮助一个类在不同的状态显示不同的行为 。
【策略模式java源代码 java策略模式优化ifelse】状态模式封装了对象的状态,而策略模式封装算法或策略 。因为状态是跟对象密切相关的,不能被重用;而通过从Context中分离出策略或算法,可以重用 。
在状态模式中,每个状态通过持有Context的引用,来实现状态转移;但是每个策略都不持有Context的引用 , 只是被Context使用 。
策略实现可以作为参数传递给使用的对象,例如Collections.sort() , 参数包含一个Comparator策略 。另一方面,状态是Context对象自己的一部分,随着时间的推移,Context对象从一个状态转移到另一个状态 。
虽然都符合OCP原则 , 策略模式也符合SRP原则(单一职责原则) , 因为每个策略都封装自己的算法,且不依赖其他策略 。一个策略的改变,并不会导致其他策略的变化 。

推荐阅读