策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
策略模式Demo:
/**
* 2018年3月25日下午7:18:05
*/
package com.Designpattern;
/**
* @author xinwenfeng
*
*/
public class TestStrategy {
/**
* @param args
*/
public static void main(String[] args) {
StrategyContext strategyContext;
strategyContext = new StrategyContext(new StrategyA());//客户端要知道具体算法
strategyContext.doStrategy();
strategyContext = new StrategyContext(new StrategyB());
strategyContext.doStrategy();
System.out.println("=======================================");
ContextAndFactory contextAndFactory;
contextAndFactory = new ContextAndFactory("A");//不需要知道算法类
contextAndFactory.doStrategy();
contextAndFactory = new ContextAndFactory("B");
contextAndFactory.doStrategy();
}
}
abstract class Strategy{
public abstract void method();
}
class StrategyA extends Strategy{//具体算法
@Override
public void method() {
System.out.println("执行策略A。");
}
}
class StrategyB extends Strategy{//具体算法
@Override
public void method() {
System.out.println("执行策略B。");
}
}
class StrategyContext{
Strategy strategy;//维护一个Strategy的引用
public StrategyContext(Strategy strategy) {
this.strategy = strategy;
}
public void doStrategy() {//根据具体策略对象调用算法
if(null != strategy) {
strategy.method();
}
}
}
class ContextAndFactory{//策略与简单工厂结合
Strategy strategy;
public ContextAndFactory(String s) {
switch(s) {
case "A":
strategy = new StrategyA();
break;
case "B":
strategy = new StrategyB();
break;
}
}
public void doStrategy() {
if(null != strategy) {
strategy.method();
}
}
}
结果: