三个角色:
环境(Context)角色:持有一个Strategy类的引用。
抽象策略(Strategy)角色:通常由一个接口或者抽象类实现,此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装相关算法和行为
为了帮助理解,我们举例来说明。
我们的程序要实现加密功能。加密有一个加密算法,加密算法有很多种,比如MD5,DES等,我们的程序需要实现这个功能,就是可以让用户选择不同的加密算法进行加密。
这个过程我们可以用Strategy模式来实现。
环境角色:
/** * Context */ class EncryptContext { //策略对象 EncryptStrategy strategy; public EncryptContext(EncryptStrategy strategy) { this.strategy = strategy; } //执行具体的策略行为 public void encrypt() { strategy.encrypt(); } }
抽象策略角色:
/** * Strategy & subclass */ interface EncryptStrategy { public void encrypt(); }
具体抽象策略角色:
//Strategy'subclass class DesStrategy implements EncryptStrategy { public void encrypt() { System.out.println("encrypt by DES algorithm."); //TODO DES algorithm HERE。这里我们没给出具体的算法。 } } //Strategy'subclass class MD5Strategy implements EncryptStrategy { public void encrypt() { System.out.println("encrypt by MD5 algorithm."); //TODO MD5 algorithm HERE。这里我们没给出具体的算法。 } }
下面我们使用此策略
public class Client { /** * Test Strategy Pattern * */ public static void main(String[] args) { //2种不同的策略 //使用DES策略(算法) EncryptContext context = new EncryptContext(new DesStrategy()); context.encrypt(); //使用MD5策略(算法) context = new EncryptContext(new MD5Strategy()); context.encrypt(); } }