编程无涯乐在其中

导航

策略模式

网上的例子:
僵尸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...");
}
}

  

 

 

posted on 2019-11-05 08:44  编程无涯乐在其中  阅读(116)  评论(0编辑  收藏  举报