设计模式之策略设计模式

时间:2022-01-12 22:02:33

一、何为策略设计模式呢?

  在我的理解中,策略模式是尽量使用组合而非继承来实现一个行为,对一个方法的进行封装来使用,在组合类中进行调用时能够随时改变这一方法的运行时的内容。下面让我们来看看将一个实现改成策略模式后的便捷性。  

二、一个简单的示例

  假设我们有一个抽象的人,他拥有会踢球跟会乐器的技能,然后有一个只会踢球不会乐器的人继承了这个抽象的人类,还有一个只会乐器不会踢球的人继承了这个抽象的人类。

 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中就可以很方便的实现方法内部的实现,而不用修改类内部的代码。

  策略设计模式也体现了面向设计模式的一个原则:多用组合,少用继承。