策略模式
网上的例子:
僵尸Demo:
https://blog.csdn.net/qq_32175491/article/details/79465496
不同充值方式的打折:
https://blog.csdn.net/u011507568/article/details/70238491
自我最终理解:
策略模式就是将一个类如类A里面的方法(会变的方法)由具体实现----》抽象为
一个接口,调用A类的方法时,A类去调用接口的方法(运行时多使得调用接口实现类的方法)。
这样就将变化的行为解耦出来了(行为变化时加一个行为实现类,这样就不用改这个A类了)
策略模式最最难理解的问题的答案:
1、策略模式的缺点是加了策略接口和多个策略类,那这样我们使用策略模式还有什么意义?
答:如果只是一个行为的话,如我们例子中的只有一个方法say()。确实没有意义。
计算一下:
不使用策略:
当say方法变化时,我们就加一个实现类。变化10次加10个实现类
使用策略:
当say方法变化时,加一个SayBehavior接口的实现类,变化10次加10个,因为相对于不使用策略我们加了策略接口,所以还要麻烦点但是如果有两个行为的话,如say,move ,每个方法有十种不同的实现,那么不使用策略要加100个实现类
使用策略模式只要20个策略类,
如果3个行为,那么分别是1000个实现类, 30个策略类
...
不用策略模式:
如果say() move ()方法任一个变化时,我们就要增加一个实现类去实现;那么需要很多类;
使用了策略模式:
say() move()方法的具体实现剥离了出来,每次say(),move()方法变化,直接创建一个say的实现类或者move的实现类
不用策略模式:
示例代码:
public abstract class Duck { public void say() { System.out.println("gaga"); } public void move() { System.out.println("I^m swimming"); } }
使用策略模式:
package Test; public class Client { public static void main(String[] args) { //正常的鸭子 Duck duck1=new Duck(); duck1.setSayBehavior(new SayBehaviorImpl1()); duck1.setMoveBehavior(new MoveBehaviorImpl1()); duck1.say(); duck1.move(); //哦是鸭(哦,是呀//鹅是鸭) Duck duck2 =new Duck(); duck2.setSayBehavior(new SayBehaviorImpl2()); duck2.setMoveBehavior(new MoveBehaviorImpl2()); duck2.say(); duck2.move(); } } //鸭子父类 public class Duck { private SayBehavior sayBehavior; private MoveBehavior moveBehavior; public void say() { sayBehavior.say(); } public void move() { moveBehavior.move(); } public SayBehavior getSayBehavior() { return sayBehavior; } public void setSayBehavior(SayBehavior sayBehavior) { this.sayBehavior = sayBehavior; } public MoveBehavior getMoveBehavior() { return moveBehavior; } public void setMoveBehavior(MoveBehavior moveBehavior) { this.moveBehavior = moveBehavior; } } //说行为策略接口 public interface SayBehavior { void say(); } //移动行为的策略接口 public interface MoveBehavior { void move(); } //移动策略实现1 public class MoveBehaviorImpl1 implements MoveBehavior{ @Override public void move() { System.out.println("I^m swimming"); } } //移动策略实现2 public class MoveBehaviorImpl2 implements MoveBehavior{ @Override public void move() { System.out.println("I^m fly"); } } //说策略实现1 public class SayBehaviorImpl1 implements SayBehavior{ @Override public void say() { System.out.println("gaga"); } } //说策略实现2 public class SayBehaviorImpl2 implements SayBehavior{ @Override public void say() { System.out.println("eee..."); } }