java策略模式
1. 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对象被创建时就被提供的。
这是专为实现排序功能而设计的策略模式UML类图。因为存在很多排序算法,该模式让Client在排序时选择适当的算法。事实上,Java的集合框架就使用这个模式,实现了用来排序的Collections.sort()方法。不同的是,不允许Client选择排序算法,而是让传递Comparator或Comparable接口的实例来指定比较策略。
(2)不同之处
策略模式封装了一组相关算法,允许Client在运行时使用可互换的行为;状态模式帮助一个类在不同的状态显示不同的行为。
状态模式封装了对象的状态,而策略模式封装算法或策略。因为状态是跟对象密切相关的,不能被重用;而通过从Context中分离出策略或算法,可以重用。
在状态模式中,每个状态通过持有Context的引用,来实现状态转移;但是每个策略都不持有Context的引用,只是被Context使用。
策略实现可以作为参数传递给使用的对象,例如Collections.sort(),参数包含一个Comparator策略。另一方面,状态是Context对象自己的一部分,随着时间的推移,Context对象从一个状态转移到另一个状态。
虽然都符合OCP原则,策略模式也符合SRP原则(单一职责原则),因为每个策略都封装自己的算法,且不依赖其他策略。一个策略的改变,并不会导致其他策略的变化。
另一个理论上的不同:策略模式定义了对象“怎么做”的部分。例如,排序对象怎么对数据排序。状态模式定义了对象“是什么”和“什么时候做”的部分。例如,对象处于什么状态,什么时候处在某个特定的状态。
状态模式中很好的定义了状态转移的次序;而策略模式并无此需要:Client可以自由的选择任何策略。
一些常见的策略模式的例子是封装算法,例如排序算法,加密算法或者压缩算法。如果看到代码需要使用不同类型的相关算法,那么考虑使用策略模式吧。而识别何时使用状态模式是很简单的:如果需要管理状态和状态转移,但不想使用大量嵌套的条件语句,那么就是了。
最后但最重要的一个不同之处是,策略的改变由Client完成;而状态的改变,由Context或状态自己。
2. java策略模式和代理模式有什么区别
这2者 根本就不能 谈什么区别。。。
完全不是一回事
策略模式:
多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
代理模式
对其他对象提供一种代理以控制对这个对象的访问。
3. java策略模式应用场景为何
我认为策略模式是java众多模式中最常用,最常见的一种模式。
一句话说,针对同一命令(或行为),不同的策略做不同的动作。 (个人总结 难免疏漏 海涵)
举例来说,一个接口有两个实现:
interface RunBehavior {
public void performRun();
}
class Run implements RunBehavior {
public void performRun() { System.out.println(" I can run!"); }
}
class JumpAsRun implements RunBehavior {
public void performRun() { System.out.println("I cannot run, but I can jump!"); }
}
解释一下这段简单的程序
跑是一种行为(接口)
正常的动物都可以跑(class Run)
麻雀是不能跑的,它只能跳(class JumpAsRun)
这样的话,其实我们有了一个行为的请求,那就是跑,然后我们有两个策略供选择。
那么如何调用呢?
class Anmial {
RunBehavior runBehavior;
public void run() {
this.runBehavior.performRun();
}
public void setRunBehavior(RunBehavior runBehavior) {
this.runBehavior = runBehavior;
}
}
下面真正开始调用:
public class TestStrategy{
public static void main(String args[]) {
RunBehavior rb1 = new Run();
Animal tiger = new Animal();
tiger.setRunBehavior(rb1);
tiger.run();
RunBehavior rb2 = new JumpAsRun();
Animal bird = new Animal();
bird.setRunBehavior(rb2);
bird.run();
// 上面的老虎和鸟分别用了一个策略,下面让老虎用鸟的策略
// 看看会发生什么
tiger.setRunBehavior(rb2);
tiger.run();
// 其实策略模式的重点就在这儿,给对象传入什么样的策略,执行什么样的动作。
}
}
具体的还要你自己多思考了,推荐《Head First Desigh Pattern》
全手工敲入代码,估计你需要微调如果想运行的话
4. java策略模式和工厂模式的区别
工厂模式是创建型模式
策略模式是行为性模式
一个关注对象创建
一个关注行为的封装
策略模式就是定义一系列的算法,这些算法可以在需要的时候替换和扩展.工厂模式是生成型的模式,在你需要的时候构建具体的实例.
在下面的情况下应当考虑使用策略模式:
1. 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2.
一个系统需要动态地在几种算法中选择一种。那么这些算法可以包装到一个个的具体算法类里面,而这些具体算法类都是一个抽象算法类的子类。换言之,这些具体
算法类均有统一的接口,由于多态性原则,客户端可以选择使用任何一个具体算法类,并只持有一个数据类型是抽象算法类的对象。
3. 一个系统的算法使用的数据不可以让客户端知道。策略模式可以避免让客户端涉及到不必要接触到的复杂的和只与算法有关的数据。
4. 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。此时,使用策略模式,把这些行为转移到相应的具体策略类里面,就可以避免使用难以维护的多重条件选择语句,并体现面向对象设计的概念。
策略模式的优点和缺点
策略模式有很多优点和缺点。它的优点有:
1. 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免重复的代码。
2.
策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提
供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑
混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。
3. 使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点有:
1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
2. 策略模式造成很多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。
策略模式与很多其它的模式都有着广泛的联系。Strategy很容易和Bridge模式相混淆。虽然它们结构很相似,但它们却是为解决不同的问题
而设计的。Strategy模式注重于算法的封装,而Bridge模式注重于分离抽象和实现,为一个抽象体系提供不同的实现。Bridge模式与
Strategy模式都很好的体现了"Favor composite over inheritance"的观点。
5. java中几种常见的设计模式
一共23种设计模式!
按照目的来分,设计模式可以分为创建型模式、结构型模式和行为型模式。
创建型模式用来处理对象的创建过程;结构型模式用来处理类或者对象的组合;行为型模式用来对类或对象怎样交互和怎样分配职责进行描述。
创建型模式用来处理对象的创建过程,主要包含以下5种设计模式:
工厂方法模式(Factory Method Pattern)
抽象工厂模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
单例模式(Singleton Pattern)
结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式:
适配器模式(Adapter Pattern)
桥接模式(Bridge Pattern)
组合模式(Composite Pattern)
装饰者模式(Decorator Pattern)
外观模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
行为型模式用来对类或对象怎样交互和怎样分配职责进行描述,主要包含以下11种设计模式:
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
备忘录模式(Memento Pattern)
观察者模式(Observer Pattern)
状态模式(State Pattern)
策略模式(Strategy Pattern)
模板方法模式(Template Method Pattern)
访问者模式(Visitor Pattern)
推荐你一本好书:《软件秘笈:设计模式那点事》,里面讲解的23中设计模式例子很生动,容易理解,还有JDK中设计模式应用情况,看了收获挺大的!网络里面搜“设计模式”,第一条中设计模式网络中就有首推该图书,浏览量在20几万以上的,不会错的。好东西大家一起分享!
祝你早日学会设计模式!
6. JAVA中的适配器模式和策略模式的区别在哪
直接从字面上看也是两个完全不同的模式;
从归类上也是一个是结构模式,一个是行为模式;
从定义角度:一个是将一个类的接口转换成客户希望的另外一个接口,从而使原本因接口不兼容不能一起工作的类可以一起工作;
一个是把一系列算法封装起来,提供一个统一的接口给客户,并使这些算法可以相互间替换;
7. java策略模式与接口直接实现
我是一个java初学者,我下面写的东西都是我个人的猜想,楼主可以作为参考,但不要相信。--------感觉由context包装以后的耦合性更低一些,传入不同的new AddStrategy(),context.calculate(10, 5)会实现不同的功能,通过这样的方式,如果通过配置文件的方式来实现对算法的配置,直接利用接口就把代码写死了,而策略模式由于具有低耦合性就可以通过配置对象来配置不同的算法。。
8. java里策略什么意思
策略模式是一种设计模式,用于处理不同情境下逻辑不同的问题。