策略模式 2018-11-04

2018-11-04  本文已影响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 开发模式之一 : 策略模式

上一篇下一篇

猜你喜欢

热点阅读