策略模式设计原则:多用组合少用继承。
策略模式定义了不同组算法族,把不同算法族封装起来,让他们之间可以互相替换,让算法独立于使用它的客户而独立变化。运行时动态改变行为;
策略模式的优点: 算法可以自由切换; 避免使用多重条件判断; 扩展性良好
策略模式的缺点:策略类会增多;所有策略类都需要对外暴露
eg:
package sjms.pattern.strategy;
/**
*
* Description:
* User: zhurong
* Date: 2018-07-24 22:29
*/
public class BlackDuck extends Duck{
@Override
public void displayer() {
System.out.println("我是黑鸭");
}
public BlackDuck(){
flyBehavior = new FlyWithWingsBehavior();
quackBehavior = new LowQuackBehavior();
}
}
package sjms.pattern.strategy;
/**
* Description:
* User: zhurong
* Date: 2018-07-24 22:25
*/
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public abstract void displayer();
public void swim(){
System.out.println("所有的鸭子都会游泳");
}
public void performFly(){
flyBehavior.fly();
}
public void performQuack(){
quackBehavior.quack();
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
package sjms.pattern.strategy;
/**
* 飞行为
* Description:
* User: zhurong
* Date: 2018-07-24 22:17
*/
public interface FlyBehavior {
public void fly();
}
package sjms.pattern.strategy;
/**
* Description:
* User: zhurong
* Date: 2018-07-24 22:42
*/
public class FlyNoWayBehavior implements FlyBehavior {
@Override
public void fly() {
System.out.println("没办法飞");
}
}
package sjms.pattern.strategy;
/**
* Description:
* User: zhurong
* Date: 2018-07-24 22:41
*/
public class FlyWithWingsBehavior implements FlyBehavior{
@Override
public void fly() {
System.out.println("我会用翅膀飞");
}
}
package sjms.pattern.strategy;
/**
*
* Description:
* User: zhurong
* Date: 2018-07-24 22:44
*/
public class HighQuackBehavior implements QuackBehavior{
@Override
public void quack() {
System.out.println("高声音叫");
}
}
package sjms.pattern.strategy;
/**
*
* Description:
* User: zhurong
* Date: 2018-07-24 22:44
*/
public class LowQuackBehavior implements QuackBehavior{
@Override
public void quack() {
System.out.println("低声音叫");
}
}
package sjms.pattern.strategy;
/**
* 叫行为
* Description:
* User: zhurong
* Date: 2018-07-24 22:19
*/
public interface QuackBehavior {
public void quack();
}
package sjms.pattern.strategy;
/**
*
* Description:
* User: zhurong
* Date: 2018-07-24 22:29
*/
public class RedDuck extends Duck{
@Override
public void displayer() {
System.out.println("我是红鸭");
}
public RedDuck(){
flyBehavior = new FlyNoWayBehavior();
quackBehavior = new HighQuackBehavior();
}
}
package sjms.pattern.strategy;
/**
*
* Description:
* User: zhurong
* Date: 2018-07-24 22:44
*/
public class ScreamQuackBehavior implements QuackBehavior{
@Override
public void quack() {
System.out.println("会尖叫");
}
}
package sjms.pattern.strategy;
/**
* Description:
* User: zhurong
* Date: 2018-07-24 22:48
*/
public class Test {
public static void main(String[] args) {
//black
Duck duck = new BlackDuck();
duck.displayer();
duck.performFly();
duck.performQuack();
System.out.println("-------------------------");
//red
Duck duck2 = new RedDuck();
duck2.displayer();
duck2.performFly();
duck2.performQuack();
System.out.println("-------------------------");
duck2.setFlyBehavior(new FlyWithWingsBehavior());
duck2.setQuackBehavior(new ScreamQuackBehavior());
duck2.performFly();
duck2.performQuack();
}
}
运行结果: