策略模式

概念

在现实生活中常常遇到实现某种目标存在多种策略可供选择的情况,例如,出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等。

策略模式结构

策略模式主要包含

  • 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

策略模式实例

定义一个大闸蟹加工的抽象策略类(CrabCooking),里面包含了一个做菜的抽象方法CookingMethod();然后,定义清蒸大闸蟹(SteamedCrabs)和红烧大闸蟹(BraisedCrabs)的具体策略类,它们实现了抽象策略类中的抽象方法;最后,定义一个厨房(Kitchen)环境类,它具有设置和选择做菜策略的方法;客户类通过厨房类获取做菜策略。

抽象策略及具体策略

package strategy;

/**
 * 抽象策略接口:大闸蟹加工类
 */
public interface CrabCooking {
    /**
     * 处理大闸蟹的策略
     */
    void cookingMethod();
}
package strategy;

/**
 * 具体策略类:清蒸大闸蟹
 */
public class SteamedCrabs implements CrabCooking {
    @Override
    public void cookingMethod() {
        System.out.println("清蒸大闸蟹!");
    }
}
package strategy;

/**
 * 具体策略类:红烧大闸蟹
 */
public class BraisedCrabs implements CrabCooking {
    @Override
    public void cookingMethod() {
        System.out.println("红烧大闸蟹!");
    }
}

上下文

维护指向具体策略的引用,且仅通过策略接口与该对象进行交流:

package strategy;

/**
 * Context类:厨房(做菜的策略)
 */
public class Kitchen {
    private CrabCooking strategy;

    public void setStrategy(CrabCooking strategy) {
        this.strategy = strategy;
    }

    public CrabCooking getStrategy() {
        return strategy;
    }

    public void cookingMethod() {
        /**
         * 做大闸蟹的策略
         */
        strategy.cookingMethod();
    }
}

客户

package strategy;

public class Client {
    public static void main(String[] args) {
        Kitchen kitchen = new Kitchen();

        SteamedCrabs steamedCrabs = new SteamedCrabs();
        // 厨房使用清蒸的方式处理大闸蟹
        kitchen.setStrategy(steamedCrabs);
        // 厨房开始做清蒸大闸蟹
        kitchen.cookingMethod();

        System.out.println("===========");
        BraisedCrabs braisedCrabs = new BraisedCrabs();
        kitchen.setStrategy(braisedCrabs);
        kitchen.cookingMethod();
    }
}
posted @ 2021-03-12 13:38  chenzufeng  阅读(72)  评论(0编辑  收藏  举报