【设计模式】策略模式

参考来源:http://www.runoob.com/design-pattern/strategy-pattern.html

  • 介绍

策略模式定义了算法簇,并将这些算法封装起来,并在运行时可以使这些算法相互替换。

  • 作用

在有多种算法相似的情况下,使用if…else会带来复杂和难以维护,这时使用策略模式将这些算法封装成一个一个的类。由于这些类实现了同一接口,因此在运行时可以相关替换。

  • 示例

  1. 介绍

    下面定义了一个Strategy接口,其方法doOperation()表示的是一个输入两个int并返回1个int的算法簇。之后有三个类实现了该接口。然后使用一个context类表示使用这些算法的对象。

  2. 类图【设计模式】策略模式_第1张图片
  3. 实现

    创建一个算法簇的接口

    
    public interface Strategy {
    
       public int doOperation(int num1,int num2);
    
    }

    实现算法簇接口的实体类

    public class OperationAdd implements Strategy{
    	@Override
    	public int doOperation(int num1, int num2) {
    		return num1 + num2;
    	}
    }
    
    public class OperationMultiply implements Strategy{
    	@Override
    	public int doOperation(int num1, int num2) {
    		return num1*num2;
    	}
    }
    
    public class OperationSubstract implements Strategy{
    	@Override
    	public int doOperation(int num1, int num2) {
    		return num1 - num2;
    	}
    }
    

    用于执行算法的Context类

    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);
    	}
    }
    

    使用Context执行算法并在运算时切换的示例

    public class StrategyPatternDemo {
    	public static void main(String[] args) {
    		Context context = new Context(new OperationAdd());
    		System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
    		
    		context = new Context(new OperationSubstract());
    		System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    		
    		context = new Context(new OperationMultiply());
    		System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    		
    		/* *
    		 * 如果使用新的算法,只需要实现Startegy接口并将这个算法类的对象传递给Context;
    		 * 之后只要调用context.executeStrategy()就可以执行新的算法;
    		 * */
    	}
    }
    

     

 

你可能感兴趣的:(设计模式)