美文网首页
策略模式 2018-11-04

策略模式 2018-11-04

作者: 单是一个姓 | 来源:发表于2018-11-04 20:56 被阅读0次

设计模式之策略模式

官方说明设计模式的3个角色:

  1. 环境角色:context , 持有一个策略的引用
  2. 抽象策略角色,是一个抽象角色,此角色给出所有的具体策略类所需的接口
  3. 具体策略角色,包装了相关的算法和行为。即抽象策略的具体实现

借图说明之间相互关系:

策略模式特点:

  • 重心不在于如何实现算法,在于如何组织、调用这些算法
  • 各个策略算法是相互独立、没有依赖、各个之间平等

案例:(写了一遍网上流行的真鸭子,假鸭子DUCK会不会飞的案例)
情景:
对象:真鸭子,石头鸭子,
能力:都会游泳(假如),真鸭子会飞,石头鸭子不会飞

策略实现:
 /**
   * 真鸭子,石头鸭子实现的抽象类
  */
public abstract class DUCK {
    /**
     * 持有一个Strategy的引用。即封装了接口鸭子飞这个行为接口
     */
    IFlyBehavior flyBehavior;
    void setFlyBehavior(IFlyBehavior fb) {
        flyBehavior = fb;
    }

    abstract void swim();

    public void fly() {
        flyBehavior.fly();
    }
}

石头鸭子和真鸭子实体类,继承抽象类DUCK

public class StoneDuck extends DUCK {
    public StoneDuck() {
        flyBehavior = new BadFlyBehavior();
    }

    @Override
    void swim() {
        System.out.println("******");
    }
}
public class RealDuck extends DUCK {
    public RealDuck() {
        flyBehavior = new GoodFlyBehavior();
    }

    @Override
    void swim() {
        System.out.println("*********");
    }
}

鸭子会飞这个能力的策略抽象接口:

/**
 * 给出所有的具体策略类所需的接口
 */
public interface IFlyBehavior {
    /**
     * 鸭子飞翔的动作
     */
    void fly();
}
public class GoodFlyBehavior implements IFlyBehavior {
    @Override
    public void fly() {
        System.out.println("****I can fly****");
    }
}
public class BadFlyBehavior implements IFlyBehavior {
    @Override
    public void fly() {
        System.out.println("***not fly***");
    }
}
public static  void  main(String[] args) {
        DUCK stoneDuck = new StoneDuck();
        stoneDuck.fly();

        // 改变策略
        stoneDuck.setFlyBehavior(new GoodFlyBehavior());
        stoneDuck.fly();

        /**
         * 打印结果:
         *
         * ***not fly***
         * ****I can fly****
         *
         */
    }

优秀策略模式文章:

JAVA与模式之策略模式
java 开发模式之一 : 策略模式

相关文章

网友评论

      本文标题:策略模式 2018-11-04

      本文链接:https://www.haomeiwen.com/subject/luydxqtx.html