策略模式,就是为了解决像有很多if else这样的代码
代码如下(示例):
/** * 公共策略 */ public interface IStratery { void operator(); } public class StrateryA implements IStratery { public void operator() { System.out.println("派张飞从左翼杀出"); } } public class StrateryB implements IStratery { public void operator() { System.out.println("派关羽从右翼杀出"); } } public class StrateryC implements IStratery { public void operator() { System.out.println("派赵云从中间直捣黄龙"); } } public class AbstractStratery { private static String ZHANG_FEI="张飞"; private static String GUAN_YU="关羽"; private static String ZHAO_YUN="赵云"; static Map<String,IStratery> map = new HashMap<String,IStratery>(); static { map.put(ZHANG_FEI,new StrateryA()); map.put(GUAN_YU,new StrateryB()); map.put(ZHAO_YUN,new StrateryC()); } static void invoke(String name){ if (name != null) { map.get(name).operator(); } } }测试一下
public class Test { public static void main(String[] args) { AbstractStratery.invoke("张飞"); AbstractStratery.invoke("关羽"); AbstractStratery.invoke("赵云"); } }比如说登录,校验,权限这一系列操作,假设一个场景,员工离职,层层递进,我们使用建造者模式加责任链模式试试。
/** * 抽象链 */ public abstract class AbstractChain<T> { protected AbstractChain<T> chain; public void next(AbstractChain<T> chain){ this.chain=chain; } public void doChain(String name) { System.out.println("开始做某事"); } public static class Buider<T>{ private AbstractChain<T> header; private AbstractChain<T> tail; public Buider<T> addChain(AbstractChain<T> chain){ if(header==null){ this.header= this.tail=chain; return this; } this.tail.next(chain); this.tail=chain; return this; } public AbstractChain<T> build(){ return this.header; } } } public class Boss extends AbstractChain{ public void doChain(String name) { System.out.println("boss开启欢送离职会"); } } /** * 人力 */ public class EmployeeA extends AbstractChain{ public void doChain(String name) { if("离职".equals(name)){ System.out.println("员工A无法解决离职问题,移送boss"); chain.doChain(name); }else { System.out.println("员工A解决"+name); } } } /** * 人力 */ public class EmployeeB extends AbstractChain { public void doChain(String name) { if("请假".equals(name)||"离职".equals(name)){ System.out.println("员工B无法解决请假或者离职问题,移送员工A"); chain.doChain(name); }else { System.out.println("员工B解决"+name); } } } /** * 人力 */ public class EmployeeC extends AbstractChain { public void doChain(String name) { System.out.println("基层员工开始"+name); chain.doChain(name); System.out.println("基层员工"+name+"完毕"); } }测试一下
public static void main(String[] args) { Boss boss = new Boss(); AbstractChain.Buider buider = new AbstractChain.Buider(); buider.addChain( new EmployeeC()).addChain( new EmployeeB()).addChain( new EmployeeA()).addChain(new Boss()).build(); buider.build().doChain("离职"); }