针对问题:在许多继承体系结构中,经常出现的一些问题是在超类中的一些接口只需在部分子类中存在。或者是超类中的接口在子类中的实现算法大同小异,就那么几种方式,这样的话每当添加一个子类就不得不在已存在某个子类中复制粘贴,没有达到复用的目的。
策略模式的结构:
策略模式的java实现:
/** * 抽象类(将那些用继承不能解决的接口换成 用组合接口的形式实现动态改变形为) * @author bruce * */ public abstract class Context { /** * 组合策略接口 */ protected Strategy strategy; /** * 委托策略形为 */ public void performAlgorithm(){ strategy.algorithmInterface(); } public abstract void otherInterface(); public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } } /** * 策略接口 * @author bruce * */ public interface Strategy { public void algorithmInterface(); } /** * 策略实现(算法A) * @author bruce * */ public class ConcreteStrategyA implements Strategy{ public void algorithmInterface() { // TODO Auto-generated method stub System.out.println("A 算法"); } } /** * 策略实现(算法B) * @author bruce * */ public class ConcreteStrategyB implements Strategy{ public void algorithmInterface() { // TODO Auto-generated method stub System.out.println("B 算法"); } } /** * 实现类(实现重构后的抽象类) * @author bruce * */ public class ConcreteContext extends Context{ public ConcreteContext(){ strategy=new ConcreteStrategyA(); } @Override public void otherInterface() { // TODO Auto-generated method stub } } /** * 测试 * @author bruce * */ public class Client { public static void main(String[] args) { Context context=new ConcreteContext();//ConcreteContext默认为A算法 context.performAlgorithm(); //output:A 算法 Strategy strategyB=new ConcreteStrategyB(); context.setStrategy(strategyB);//改变context的算法 context.performAlgorithm();//output:B 算法 } }