《JAVA与模式》之策略模式

策略模式的定义

  定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。

  策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。

策略模式的组成

  抽象策略角色:策略类,通常由一个接口或者抽象类实现。

  具体策略角色:包装了相关的算法和行为。

  环境角色:持有一个策略类的引用,最终给客户端用的。


一个简单的例子

 1 public class Strategy {
 2     
 3     
 4     public static void main(String[] args) {
 5         
 6         IStrategy iStrategy =new StrategyB();
 7         Context context =new Context(iStrategy);
 8         context.doStrategy();
 9     }
10 
11 }
12 
13 
14 
15 class Context{
16     
17     private IStrategy iStrategy;
18     
19     public Context(IStrategy iStrategy){
20         
21         this.iStrategy=iStrategy;
22     }
23     
24     
25     public void doStrategy(){
26         
27         iStrategy.say();
28         
29     }
30     
31 }
32 
33 
34 interface  IStrategy{
35     
36     public void say();
37     
38 }
39 
40 class StrategyA implements IStrategy{
41 
42     @Override
43     public void say() {
44         System.out.println("StrategyA");
45     }
46 }
47 class StrategyB implements IStrategy{
48     
49     @Override
50     public void say() {
51         System.out.println("StrategyB");
52     }
53 }
54 class StrategyC implements IStrategy{
55     
56     @Override
57     public void say() {
58         System.out.println("StrategyC");
59     }
60 }

拓展联想:如何设计一个计算器 包含加减乘除四个策略

策略模式的缺点:客户端必须知道有多少个可用策略,每一个策略都要创建一个对象,可使用工厂模式来解决

策略模式与状态模式的区别

1.状态模式之间的实现类是互斥的,而对策模式则是并行的

2.策略模式是由客户端来控制具体使用哪个策略

  而状态模式是需要通过state或则context自身来做判断管理的

策略模式配合工厂模式解决If else 过多的问题

 StateFactory.java

static Map<String,Class> states = new HashMap<String,Class>();
static{
   states.put("A",ConcreteStateA.class);
   states.put("B",ConcreteStateB.class);
}

public static State createState(String key){
    return (State)states.get(key).newInstance();
}

//调用
StateFactory.createState(state).handle();  

参考:

http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html

http://www.cnblogs.com/mengdd/archive/2013/01/19/2867443.html

http://yangguangfu.iteye.com/blog/815107

http://www.iteye.com/topic/1112645?page=1

原文地址:https://www.cnblogs.com/draem0507/p/3784922.html