[size=x-large][b]策略模式[/b][/size]
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。
_____________________________________________________________________________________
[size=x-large][b]介绍[/b][/size]
[b]意图:[/b]定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。
[b]主要解决:[/b]在有多种算法相似的情况下,使用if.....else所带来的复杂和难以维护。
[b]何时使用:[/b]一个系统有许多许多类,而区分它们的只是他们直接的行为。
[b]如何解决:[/b]将这些算法封装成一个一个的类,任意地替换。
[b]应用实例:[/b]选择旅行出游的方式,可选择骑自行车、汽车、火车、飞机...,每一种旅行方式都可以是一个策略。
[b]优点:[/b]1、算法可以自由切换。2、避免使用多重条件判断。3、扩展性良好。
[b]缺点:[/b]1、策略类会增多。2、所有策略类都需要对外暴露。
[b]使用场景:[/b]1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。2、一个系统需要动态地在几种算法中选择一种。3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
[b]注意事项:[/b]如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
__________________________________________________________________________________
[size=x-large][b]实现[/b][/size]
我们将创建一个定义活动的Strategy接口和实现了Strategy接口的实体策略类。Context是一个使用了某种策略的类。
StrategyPatternDemo,我们的演示类使用Context和策略对象来演示Context在它所配置或使用的策略改变时的行为变化。
[img]http://dl2.iteye.com/upload/attachment/0128/8462/80e06ed5-c1d9-385f-8e73-9138d8ccacfa.jpg[/img]
__________________________________________________________________________________
[size=small][b]步骤1[/b][/size]
Strategy.java
[size=small][b]步骤2[/b][/size]
创建实现接口的实体类。
AddStrategy.java
SubstractStrategy.java
MultiplyStrategy.java
DivideStrategy.java
[size=small][b]步骤3[/b][/size]
创建Context类。
Context.java
使用枚举方式
[size=small][b]步骤4[/b][/size]
使用Context来查看当它改变策略Strategy时的行为变化。
StrategyPatternDemo.java
使用枚举方式调用
[size=small][b]步骤5[/b][/size]
验证结果。
__________________________________________________________________________________
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。
_____________________________________________________________________________________
[size=x-large][b]介绍[/b][/size]
[b]意图:[/b]定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。
[b]主要解决:[/b]在有多种算法相似的情况下,使用if.....else所带来的复杂和难以维护。
[b]何时使用:[/b]一个系统有许多许多类,而区分它们的只是他们直接的行为。
[b]如何解决:[/b]将这些算法封装成一个一个的类,任意地替换。
[b]应用实例:[/b]选择旅行出游的方式,可选择骑自行车、汽车、火车、飞机...,每一种旅行方式都可以是一个策略。
[b]优点:[/b]1、算法可以自由切换。2、避免使用多重条件判断。3、扩展性良好。
[b]缺点:[/b]1、策略类会增多。2、所有策略类都需要对外暴露。
[b]使用场景:[/b]1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。2、一个系统需要动态地在几种算法中选择一种。3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
[b]注意事项:[/b]如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
__________________________________________________________________________________
[size=x-large][b]实现[/b][/size]
我们将创建一个定义活动的Strategy接口和实现了Strategy接口的实体策略类。Context是一个使用了某种策略的类。
StrategyPatternDemo,我们的演示类使用Context和策略对象来演示Context在它所配置或使用的策略改变时的行为变化。
[img]http://dl2.iteye.com/upload/attachment/0128/8462/80e06ed5-c1d9-385f-8e73-9138d8ccacfa.jpg[/img]
__________________________________________________________________________________
[size=small][b]步骤1[/b][/size]
Strategy.java
public interface Strategy {
public int doOperation(int num1,int num2);
}
[size=small][b]步骤2[/b][/size]
创建实现接口的实体类。
AddStrategy.java
public class AddStrategy implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1+num2;
}
}
SubstractStrategy.java
public class SubstractStrategy implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1-num2;
}
}
MultiplyStrategy.java
public class MultiplyStrategy implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1*num2;
}
}
DivideStrategy.java
public class DivideStrategy implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1/num2;
}
}
[size=small][b]步骤3[/b][/size]
创建Context类。
Context.java
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1,int num2){
return strategy.doOperation(num1, num2);
}
}
使用枚举方式
public enum Context {
ADD("加法",new AddStrategy()),
SUBSTRACT("减法",new SubstractStrategy()),
MULTIPLY("乘法",new MultiplyStrategy()),
DIVIDE("除法",new DivideStrategy());
private String title;
private Strategy strategy;
Context(String title,Strategy strategy){
this.title = title;
this.strategy = strategy;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
[size=small][b]步骤4[/b][/size]
使用Context来查看当它改变策略Strategy时的行为变化。
StrategyPatternDemo.java
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new AddStrategy());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new SubstractStrategy());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new MultiplyStrategy());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
context = new Context(new DivideStrategy());
System.out.println("10 / 5 = " + context.executeStrategy(10, 5));
}
}
使用枚举方式调用
public class StrategyPatternDemo {
public static void main(String[] args) {
System.out.println("10 + 5 = "+Context.ADD.getStrategy().doOperation(10, 5));
System.out.println("10 - 5 = "+Context.SUBSTRACT.getStrategy().doOperation(10, 5));
System.out.println("10 * 5 = "+Context.MULTIPLY.getStrategy().doOperation(10, 5));
System.out.println("10 / 5 = "+Context.DIVIDE.getStrategy().doOperation(10, 5));
}
}
[size=small][b]步骤5[/b][/size]
验证结果。
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
10 / 5 = 2
__________________________________________________________________________________