策略模式(strategy)
程序员文章站
2022-07-13 15:02:27
...
一句话:封装算法,算法的变化不影响算法的使用。
定义:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。
需要解决的问题:
在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
如何解决:
将这些算法封装成一个一个的类,任意地替换。
优点:
1、算法可以*切换。
2、避免使用多重条件判断。
3、扩展性良好。
缺点:
1、策略类会增多。
2、所有策略类都需要对外暴露。
使用场景:
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
应用实例:
spring AOP中动态代理有两种实现方式:jdk动态代理和cglib动态代理,就是使用了策略模式
UML类图:
策略模式包含如下角色:
Context: 环境类
Strategy:策略接口
StrategyImpl: 具体策略类
demo:
1.Strategy接口
/**
* 策略接口
*
*/
public interface Strategy {
public void doSomething();
}
2.StrategyImpl1实现类
package com.pattern.strategy;
public class StrategyImpl1 implements Strategy{
@Override
public void doSomething() {
System.out.println("策略1");
}
}
3.StrategyImpl2实现类
package com.pattern.strategy;
public class StrategyImpl2 implements Strategy {
@Override
public void doSomething() {
System.out.println("策略2");
}
}
4.Context环境类
package com.pattern.strategy;
/**
* 环境类
*
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void execute() {
strategy.doSomething();
}
}
5.Client测试类
package com.pattern.strategy;
public class Client {
public static void main(String[] args) {
Context context = null;
System.out.println("-----执行策略1-----");
context = new Context(new StrategyImpl1());
context.execute();
System.out.println("-----执行策略2-----");
context = new Context(new StrategyImpl2());
context.execute();
}
}
上一篇: Netty系列之Netty并发编程
下一篇: 行为型模式之策略模式