策略模式
定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户
设计原则
找出应用中可能需要改变之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
针对接口编程而不是针对实现编程
多用组合少用继承
下面是一个策略模式的代码,当做例子:
duck抽象类:
package design;
/**
* @author Mingming
* @Description
* @Date Created in 13:48 2017/10/29
* @Modificd By
*/
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public abstract void display();
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
public void performQuack(){
quackBehavior.quack();
}
public void performFly(){
flyBehavior.fly();
}
}
duck实现类:
package design;
/**
* @author Mingming
* @Description
* @Date Created in 13:56 2017/10/29
* @Modificd By
*/
public class ModelDuck extends Duck {
@Override
public void display() {
System.out.println("I am a ModelDuck");
}
}
FlyBehavior接口:
package design;
/**
* @author Mingming
* @Description
* @Date Created in 13:48 2017/10/29
* @Modificd By
*/
public interface FlyBehavior {
public void fly();
}
FlyBehavior实现
package design;
/**
* @author Mingming
* @Description
* @Date Created in 13:49 2017/10/29
* @Modificd By
*/
public class FlyEithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("I am flying");
}
}
package design;
/**
* @author Mingming
* @Description
* @Date Created in 13:50 2017/10/29
* @Modificd By
*/
public class FlyNoway implements FlyBehavior{
@Override
public void fly() {
System.out.println("I can't fly");
}
}
QuackBehavior接口:
package design;
/**
* @author Mingming
* @Description
* @Date Created in 13:51 2017/10/29
* @Modificd By
*/
public interface QuackBehavior {
public void quack();
}
QuackBehavior实现:
package design;
/**
* @author Mingming
* @Description
* @Date Created in 13:51 2017/10/29
* @Modificd By
*/
public class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("Quack");
}
}
package design;
/**
* @author Mingming
* @Description
* @Date Created in 13:52 2017/10/29
* @Modificd By
*/
public class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("squeak");
}
}
测试类:
package design;
/**
* @author Mingming
* @Description
* @Date Created in 13:56 2017/10/29
* @Modificd By
*/
public class MiniDuckSimulator {
public static void main(String[] args){
ModelDuck modelDuck = new ModelDuck();
modelDuck.setFlyBehavior(new FlyEithWings());
modelDuck.setQuackBehavior(new Quack());
modelDuck.display();
modelDuck.performFly();
modelDuck.performQuack();
}
}