专业的JAVA编程教程与资源

网站首页 > java教程 正文

java面试必问——设计模式之策略模式(Strategy Pattern)

temp10 2024-09-30 00:30:21 java教程 64 ℃ 0 评论

在我们平常撸代码的时候,难免会遇到这样的问题:if...else if....else if...else.....

这样的问题,相信大家经常遇到,如果条件里面的代码量太大时这个时候代码的可读性就很差,这样的复杂程度,很难维护。这个时候简单的可以理解为一个类的行为和算法可以动态更改。那么这个时候我们就可以考虑策略模式了

java面试必问——设计模式之策略模式(Strategy Pattern)

策略模式:将不同的算法或者行为封装成不同的实现类也叫做策略类

优点:1.算法可以自由切换 2.避免使用多重条件判断 3.扩展性良好

缺点:1:策略类会很多 2.策略类对外暴露了

具体实现如下:

步骤 1

创建一个接口。

Strategy.java

public interface Strategy {

public int doOperation(int num1, int num2);

}

步骤 2

创建实现接口的实体类。

OperationAdd.java

public class OperationAdd implements Strategy{

@Override

public int doOperation(int num1, int num2) {

return num1 + num2;

}

}

OperationSubstract.java

public class OperationSubstract implements Strategy{

@Override

public int doOperation(int num1, int num2) {

return num1 - num2;

}

}

OperationMultiply.java

public class OperationMultiply implements Strategy{

@Override

public int doOperation(int num1, int num2) {

return num1 * num2;

}

}

步骤 3

创建 Context 类。

Context.java

public class Context {

private Strategy strategy;

public Context(Strategy strategy){

this.strategy = strategy;

}

public int executeStrategy(int num1, int num2){

return strategy.doOperation(num1, num2);

}

}

步骤 4

使用 Context 来查看当它改变策略 Strategy 时的行为变化。

StrategyPatternDemo.java

public class StrategyPatternDemo {

public static void main(String[] args) {

Context context = new Context(new OperationAdd());

System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

context = new Context(new OperationSubstract());

System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

context = new Context(new OperationMultiply());

System.out.println("10 * 5 = " + context.executeStrategy(10, 5));

}

}

步骤 5

执行程序,输出结果:

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50
  1. 与状态模式的比较
  2. 状态模式的类图和策略模式类似,并且都是能够动态改变对象的行为。但是状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context 本身的决策来改变组合的 Strategy 对象。所谓的状态转移,是指 Context 在运行过程中由于一些条件发生改变而使得 State 对象发生改变,注意必须要是在运行过程中。
  3. 状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 Context 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 Context 使用的算法。
  4. xiaoxc
  5. xiaoxc
  6. xia***@126.com
  7. 8个月前 (12-06)
  8. bruce
  9. 597***561@qq.com
  10. 0
  11. Context.java 文件改为:
public class Context {
 private Strategy strategy;
 
 public Context(){
 
 }
 public SetStrategy(Strategy strategy){
 this.strategy = strategy;
 }
 public int executeStrategy(int num1, int num2){
 return strategy.doOperation(num1, num2);
 }
}
  1. 调用改为:
public static void main(String[] args) {
 Context context = new Context(); 
 context.SetStrategy(new OperationAdd()); 
 System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
 context.SetStrategy(new OperationSubstract()); 
 System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
 context.SetStrategy(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
  1. 这样就不用重复的 new Context 了。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表