一、何为策略设计模式呢?
在我的理解中,策略模式是尽量使用组合而非继承来实现一个行为,对一个方法的进行封装来使用,在组合类中进行调用时能够随时改变这一方法的运行时的内容。下面让我们来看看将一个实现改成策略模式后的便捷性。
二、一个简单的示例
假设我们有一个抽象的人,他拥有会踢球跟会乐器的技能,然后有一个只会踢球不会乐器的人继承了这个抽象的人类,还有一个只会乐器不会踢球的人继承了这个抽象的人类。
1 abstract class People{ 2 abstract void playBall(); 3 abstract void playInstrument(); 4 } 5 6 /** 7 * 一个只会乐器的人 9 * 10 */ 11 class InstrumentPeople extends People{ 12 13 @Override 14 void playBall() { 15 16 } 17 18 @Override 19 void playInstrument() { 20 System.out.println(" I can play piano"); 21 } 22 23 } 24 25 /** 26 * 一个只会打球的人28 * 29 */ 30 class PysicalPeople extends People{ 31 32 @Override 33 void playBall() { 34 System.out.println("I can play basketBall"); 35 } 36 37 @Override 38 void playInstrument() { 39 40 } 41 42 }
在继承的模式中我们只能必须实现那个不能完成的方法,那个方法已然成为了一个冗余的空壳方法。
当我们把实现的方式改成策略设计模式
/** * 一个只会打球的人 * */ class PysicalPeople{ private PlayBall playBall; public void setPlayBall(PlayBall playBall) { this.playBall = playBall; } public void playBall(){ this.playBall.play(); } } /** * 一个只会乐器的人 * */ class InstrumentPeople{ private PlayInstrument playInstrument; public void setPlayInstrument(PlayInstrument playInstrument) { this.playInstrument = playInstrument; } public void palyInstrument(){ this.playInstrument.play(); } } interface PlayBall{ void play(); } class PlayBasketBall implements PlayBall{ public void play() { System.out.println("I can play basketball"); } } interface PlayInstrument{ void play(); } class PlayPiano implements PlayInstrument{ public void play() { System.out.println("I can play piano"); }
我们在策略模式中将方法表现为一个类,在不同的人类中通过组合来实现不同的技能,实现方式改为策略设计模式之后,我们可以很容易的让一个类去拥有某一个方法,而不会存在冗余的方法。当我们需要需要PysicalPeople会踢足球时,只需要继承playBall接口实现一个PlayFootBal类,通过setPlayBall方法将PlayFootBall对象设置到PysicalPeople中就可以很方便的实现方法内部的实现,而不用修改类内部的代码。
策略设计模式也体现了面向设计模式的一个原则:多用组合,少用继承。