为啥先说策略模式呢,当然是听着策略这个词比较厉害了,开玩笑,其实是它比较简单,好理解!
1. 定义
策略(Strategy)模式,定义一系列算法,并将每个算法封装起来,使它们可以被统一使用,且算法的改变不影响具体使用方。
2. 优点
1)可以避免多重条件语句,如if...else语句,switch...case语句等
2)算法可重用,避免重复的代码实现,也可以把算法族转移到公共父类中
3)可以提供相同行为的不同实现,使用方可以根据自己的需求自由选择
4)提供了对开闭原则的完美支持,可以不修改原代码的情况下,灵活添加新算法
3. 缺点
1)使用方需要了解每个策略算法的含义和区别,以便选择最合适的
2)策略模式可能会造成有很多的策略类,增加了维护的难度
4. 结构
- 抽象策略类:定义的一个公共接口,供各个算法实现这个接口
- 具体策略类:实现抽象策略类定义接口,提供具体的算法实现
- 环境类:对一个策略类的引用
5. 实现
我们做一道菜呢,可能会有很多种做法,比如煎、蒸、煮等
今天妈妈做什么样的菜呢,是煎呢,还是煮呢,当然了,妈妈很都会做,大家喜欢什么,报菜名就可以了,
妈妈可掌握了各种做法,来者不拒,厉害呢!
我们看看具体的做法策略实现:
//抽象策略类
interface CookStrategy {
public void cook();
}
//煎的策略做法
class FriedCookStrategy implements CookStrategy {
@Override
public void cook() {
System.out.println("煎的烹饪做法");
}
}
//蒸的策略做法
class SteamedCookStrategy implements CookStrategy {
@Override
public void cook() {
System.out.println("蒸的烹饪做法");
}
}
//环境使用类,厨师
class Shef {
private CookStrategy cookStrategy;
public CookStrategy getCookStrategy() {
return cookStrategy;
}
public void setCookStrategy(CookStrategy cookStrategy) {
this.cookStrategy = cookStrategy;
}
public void cook(){
cookStrategy.cook();
}
}
public class StrategyTest {
public static void main(String[] args) {
//厨师,我要开始做饭了
Shef shef = new Shef();
//小明说,我喜欢吃油煎的,香!
CookStrategy cookStrategy = new FriedCookStrategy();
shef.setCookStrategy(cookStrategy);
shef.cook();
//小红说,我喜欢蒸的,健康也很美味!
cookStrategy = new SteamedCookStrategy();
shef.setCookStrategy(cookStrategy);
shef.cook();
}
}
//煎的烹饪做法
//蒸的烹饪做法
网友评论