策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式的优点有:策略模式提供了管理相关的算法族的办法、策略模式提供了可以替换继承关系的办法、使用策略模式可以避免使用多重条件转移语句。
以上来自百度百科!!
设计原则:
1、找出应用中可能需要变化之处,把它独立出来,不要和那些不需要变化的代码混在一起。
2、针对接口编程,而不是针对实现编程。
3、多用组合,少用继承。
类图:
代码:
两个接口:FlyBehavior、QuackBehavior
/**
* 飞行接口
*/
public interface FlyBehavior {
/**
* 飞行方法
*/
public void fly();
}
/**
* 叫声接口
*/
public interface QuackBehavior {
/**
* 叫声接口
*/
public void quack();
}
两个接口实现类:FlyWithRocket 、HeQuack
public class FlyWithRocket implements FlyBehavior{
@Override
public void fly() {
System.out.println("Fly With Rocket!!!");
}
}
public class HeQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("guaguaguagsdfsdfsdf");
}
}
鸭子实体 Duck
/**
* 鸭子实体
*/
public class Duck {
public FlyBehavior flyBehavior;
public QuackBehavior quackBehavior;
public void performQuack(){
quackBehavior.quack();
}
public void performFly(){
flyBehavior.fly();
}
public void swim(){
}
public void display(){
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
鸭子实体子类:ModelDuck
/**
* 模型鸭子实体
*/
public class ModelDuck extends Duck{
public ModelDuck(){
flyBehavior=new FlyNoWay();
quackBehavior=new HeQuack();
}
@Override
public void display() {
//*****
}
}
运行测试类:PatternStrategy
/**
* Created by zyzhmily on 2018/5/19.
*/
public class PatternStrategy {
public static void main(String[] args){
Duck model=new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyNoWay());
model.performFly();
}
}
本文来自 《Head First 设计模式》
网友评论