策略模式
引言
今天家里买了点大闸蟹,弟弟想红烧吃,妹妹想清蒸吃,该如何是好呢?
正文
策略模式,就是将一系列功能类似的算法包装起来,使其可以相互替换,并且每种算法内部的改变并不会影响用户的调用。
核心思想
策略模式通过对不同的算法进行封装,从而达到算法的实现和调用相分离的目的,不同的算法只需要各自实现,环境类只需要在根据不同的情况调用不同的算法即可。
代码实现
讲解
抽象策略接口:
public interface Strategy {
public void strategyMethod();
}
不同的算法:
class StrategyA implements Strategy {
@Override
public void strategyMethod() {
System.out.println("StrategyA");
}
}
class StrategyB implements Strategy {
@Override
public void strategyMethod() {
System.out.println("StrategyB");
}
}
环境类:
class Context {
private Strategy mStrategy;
public Strategy getStrategy() {
return mStrategy;
}
public void setStrategy(Strategy strategy) {
this.mStrategy = strategy;
}
public void strategyMethod() {
mStrategy.strategyMethod();
}
}
实例
//做螃蟹接口
public interface CookCrab {
void cookCrab();
}
//红烧螃蟹
public class BraiseCrab implements CookCrab {
@Override
public void cookCrab() {
System.out.println("红烧螃蟹哦~");
}
}
//清蒸螃蟹
public class SteamCrab implements CookCrab {
@Override
public void cookCrab() {
System.out.println("清蒸螃蟹哦~");
}
}
//环境类
public class CrabContext {
private CookCrab mCookCrab;
public CookCrab getCookCrab() {
return mCookCrab;
}
public void setCookCrab(CookCrab cookCrab) {
this.mCookCrab = cookCrab;
}
public void startCookCrab() {
mCookCrab.cookCrab();
}
}
//调用
public class example {
public static void main(String[] args) {
//推荐写法
CrabContext crabContext = new CrabContext();
crabContext.setCookCrab(new BraiseCrab());
// crabContext.setCookCrab(new SteamCrab());
crabContext.startCookCrab();
}
}
总结
策略模式将实现和调用进行分离,从而可以对每种算法进行更有效的管理。同时由于其对开闭原则的良好支持,它可以在不修改原来代码的情况下,增加新的算法。但在使用策略模式之前,需要对不同的算法都要有所了解,才能更好的理解其异同并选择合适的算法。