策略模式
1、概念理解
定义一组算法族,对不同场景实现采用相应的算法实现,实现的同一种交互能力可以在不同的场景实现不同效果。
把对象的能力抽象出来,在通过依赖注入的方式,把能力注入给对象,面对不同对象同种能力,相同对象不同场景,注入相应的能力。
2、示例
public class Duck {
private FlyAble flyAble;
private void setFlyAble(FlyAble flyAble) {
this.flyAble = flyAble;
}
public Duck() {
}
public Duck(FlyAble flyAble) {
this.flyAble = flyAble;
}
public void fly(){
this.flyAble.fly();
}
}
public class WildDuck extends Duck{
private FlyAble flyAble;
public WildDuck(FlyAble flyAble) {
this.flyAble = flyAble;
}
public WildDuck() {
}
@Override
public void fly() {
flyAble.fly();
}
public void setFlyAble(FlyAble flyAble) {
this.flyAble = flyAble;
}
}
public class PetDuck extends Duck{
private FlyAble flyAble;
public PetDuck() {
}
public PetDuck(FlyAble flyAble) {
this.flyAble = flyAble;
}
@Override
public void fly() {
flyAble.fly();
}
public void setFlyAble(FlyAble flyAble) {
this.flyAble = flyAble;
}
}
public interface FlyAble {
void fly();
}
public class NormalFlyAble implements FlyAble{
@Override
public void fly() {
System.out.println("flying normal");
}
}
public class SuperFastFlyAble implements FlyAble{
@Override
public void fly() {
System.out.println("flying super fast");
}
}
public class Test {
public static void main(String[] args) {
FlyAble normalFlyAble = new NormalFlyAble();
FlyAble superFastFlyAble = new SuperFastFlyAble();
PetDuck petDuck = new PetDuck(normalFlyAble);
WildDuck wildDuck = new WildDuck(superFastFlyAble);
petDuck.fly();
wildDuck.fly();
System.out.println("训练了petDuck飞的很快");
petDuck.setFlyAble(superFastFlyAble);
petDuck.fly();
System.out.println("被收养了吃肥了飞的比以前慢了");
wildDuck.setFlyAble(normalFlyAble);
wildDuck.fly();
}
}
运行结果:
flying normal
flying super fast
训练了petDuck飞的很快
flying super fast
被收养了吃肥了飞的比以前慢了
flying normal