zoukankan      html  css  js  c++  java
  • 策略模式

    应用场景:

    1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
    2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。

    首先看代码,了解实现思路,然后进行总结,前面讲一堆,作为新手,直接懵了!

     

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

    1、接口

    定义一个方法,在实现类中实现它,用于执行“加、减”操作

    /*
     * 策略接口
     */
    public interface Strategy {
    
    	public int doOperation(int num1 , int num2);
    	
    }
    

     

    二、具体策略角色:包装了相关的行为。

    1、第一个实现类:执行“加”操作

    /*
     * 策略接口实现类:加
     */
    public class OperationAdd implements Strategy {
    
    	@Override
    	public int doOperation(int num1, int num2) {
    		return num1 + num2;
    	}
    
    }
    

     

    2、第二个实现类:执行“减”操作

    /*
     * 策略接口实现类:减
     */
    public class OperationSubstract implements Strategy{
    
    	@Override
    	public int doOperation(int num1, int num2) {
    		return num1 - num2;
    	}
    
    }
    

     

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

    在此为:Context类 ,定义 当它改变策略 Strategy 时的行为变化。

    public class Context {
    
    	private Strategy strategy ;
    	
    	//new "加"对象,Strategy为"加"实现类; new "减"对象,Strategy为"减"实现类;
    	public Context(Strategy strategy){	
    		this.strategy = strategy;
    	}
    	
    	public int executeStrategy(int num1, int num2){
    	      return strategy.doOperation(num1, num2);
    	}
    }
    

     

    四、Main类

     

    public class StrategyPatternDemo {
    	
    	public static void main(String[] args) {
    		
    		//new "加"对象
    		Context context = new Context(new OperationAdd());
    		System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
    		
    		//new "减"对象
    		context = new Context(new OperationSubstract());        
    	    System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    
    	}
    	
    }
    

     

    设计原则一:找出程序中可能需要变化的地方和不需要变化的地方,将它们独立开来。让系统中的某部分改变不会影响其他部分。

    设计原则二:针对接口编程,而不是针对实现。

      比如,为了实现复用,采用继承父类的方法,子类就都继承了父类的这些行为;但是有时候,父类的这些方法,不同的子类可能想要的不一样,这不是想要的结果;

      面向接口编程,接口定义一个方法,接口的实现类根据不同行为来分别实现。在运行时可以动态选择具体要执行的行为,比如上面Main方法里,需要什么行为,就new哪个接口的实现类。

    设计原则三:多用组合,少用继承。

      "加"和"减"这两种不同的行为,我们分别为其建立两组不同的行为类,然后在Context类中通过接口实例变量结合起来,这就是”组合“。使得系统具有很大的弹性,还可以”在运行时动态地改变行为“。

  • 相关阅读:
    C# 打开Word文档错误
    (转)ArcObjects SDK(AE)10.1在vs2012安装的方法
    arcgis 10.3 属性表乱码解决方案
    克里格插值结果覆盖指定范围
    MySQL查询不到中文的问题
    集电极开路,漏极开路,推挽,上拉电阻,弱上拉,三态门,准双向口【转】
    老牌激活工具– Microsoft Toolkit 2.4.3 + 详细图文教程【转】
    老牌激活工具 — Microsoft Toolkit 2.5.1正式版【转】
    SoftDevice Specification v1.2
    nRF51822 之 Interrupt
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/7552720.html
Copyright © 2011-2022 走看看