`

锈才学设计模式之 —— 策略模式(Strategy Pattern)

阅读更多

锈才学设计模式之  —— 策略模式

 

策略模式把功能提供者单独封装成类,使它们可以互相替换使用,让功能提供者独立于使用者(调用者).

 

说明:

       在面向对象编程中,我们尽量将功能(类)设计成复用,以符合OO思想。往往在开始都喜欢用继承来实现类的重用,当子类继承父类时,就可以重用父类的公共属性和方法。比如:
继承图

这种继承的方法,将使子类的方法都由父类继承而来,此例中,各种方式的加密子类继承父类的加密、解密方法,对于一种加密方式时可以满足,但是如果需要多种加密方法时就无法满足,就有很大的局限性,不具备足够的弹性,比如此图中的类别,当[报文加密]使用MD5算法,[Excel加密] 使用SHA算法时,往往就不能满足调用者的要求。此时就需要将功能提供方单独封装成类,独立于调用方,通过互相替换,达到各个功能的调用。比如:
策略模式

在这图例中,在算法父类“有一个”算法的接口,将具体的算法都委托给它代为处理,并提供set、get方法。这样,子类的具体算法就不是继承父类而来,而是和适合的算法组合而来。这种组合建立的模型非常有弹性,更特别的是可以在运行时动态改变算法(行为),只要组合的对象符合父类算法的接口标准就可以。这种模式设计后,如果扩展一个[XML加密]类,它使用DES算法,则非常简单,增加[XML加密类],继承[加解密算法]父类,新增一个[DES算法类],实现算法接口,然后就可以在XML加密类中动态指定DES算法了。

示例代码:
    == 加解密算法父类 ==

package com.jody.pattern.strategy;
/**
 * 功能/模块:策略模式
 * 类描述:加解密算法类
 * @author JODY 
 * @version P1.15.5 Mar 16, 2009 11:23:20 PM
 * @see 修订历史 
 * @see 相关类连接
 */
public class Arithmetic {
	private IArithmetic Abehavior;//算法接口
	
	public IArithmetic getAbehavior() {
		return Abehavior;
	}
	/**
	 * 动态替换算法
	 * @param abehavior
	 */
	public void setAbehavior(IArithmetic abehavior) {
		Abehavior = abehavior;
	}
	/**
	 * 加密
	 * @param estr 明文
	 * @return
	 */
	public String encrypt(String estr){
		return null;
	}
	/**
	 * 解密
	 * @param dstr 密文
	 * @return
	 */
	public String decrypt(String dstr){
		return null;
	}
}

 

   == 报文加密子类 == 

package com.jody.pattern.strategy;
/**
 * 功能/模块:设计模式
 * 类描述:报文加密
 * @author JODY
 * @version 1.0
 * @see 修订历史 
 * @see 相关类连接
 */
public class Message extends Arithmetic {
	public Message(){
		//动态组合MD5算法
		setAbehavior(new MD5Impl());
	}
	public void display(){
		System.out.println("这是报文加密");
	}
}

   
  == 算法接口 ==  

package com.jody.pattern.strategy;
/**
 * 功能/模块:设计模式
 * 类描述:算法接口
 * @author JODY
 * @version 1.0
 * @see 修订历史 
 * @see 相关类连接
 */
public interface IArithmetic {
	/**
	 * 加密
	 * @param estr
	 * @return
	 */
	public String encrypt(String estr);
	/**
	 * 解密
	 * @param dstr
	 * @return
	 */
	public String decrypt(String dstr);
}

 

   == MD5算法实现类 ==

package com.jody.pattern.strategy;
/**
 * 功能/模块:设计模式
 * 类描述: MD5加密算法
 * @author JODY
 * @version 1.0
 * @see 修订历史 
 * @see 相关类连接
 */
public class MD5Impl implements IArithmetic {

	public String decrypt(String dstr) {
		// TODO 加密
		return null;
	}

	public String encrypt(String estr) {
		// TODO 解密
		return null;
	}

}

 

   == 测试调用类 == 

package com.jody.pattern.strategy;
/**
 * 功能/模块:设计模式
 * 类描述: 测试类
 * @author JODY
 * @version 1.0
 * @see 修订历史 
 * @see 相关类连接
 */
public class TestClass {
	public static void main(String args[]){
		Arithmetic a = new Message();
		//a.setAbehavior(new MD5Impl());//Message初始化了MD5Impl
		String dstr = a.encrypt(args[0]);//加密		
	}
}

 

说明:

       当TestClass中实例new Message()报文算法时,初始化将采用MD5算法.这样调用者和提供者就独立开了,非常容易扩展。

 

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

 

  • 大小: 25.8 KB
  • 大小: 47.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics