【九月打卡】第17天+策略模式

2022/9/22 4:17:17

本文主要是介绍【九月打卡】第17天+策略模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

课程名称:Java设计模式精讲 Debug方式+内存分析

课程章节:第19章 策略模式讲解+Coding+源码解析

主讲老师:Geely

课程内容:

策略模式:(相同行为,不同实现)

问题1)定义和uml图?

定义算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。

应用层调用不同的不同的算法,算法你封装到不同的类中。

场景:

促销策略:满减,等

问题2)使用场景

  1. 系统中有很多类,区别在于他们的行为不同。使用策略模式,动态的从许多行为中,选择一个行为,一个行为一个类,一个策略。

  2. 一个系统中存在多个算法,选择其中一个算法,就是选择其中一个策略。

优点:

  1. 开闭原则,不修改原有类,仅添加类。

  2. 避免多重if,else语句。

  3. 不需要关心策略的具体实现,只需要使用这个策略就可以。

缺点:

1,客户端必须知道所有的策略类,并且自行选择使用那个策略类。

2,会多出了很多策略类。

工厂模式和策略模式的区别?

工厂模式是创建型,策略模式行为型。

工厂模式是根据要求创建对象。

策略模式是接收创建好的对象。

策略模式和状态模式区别?

策略模式的客户端,要知道到底选择哪个策略行为。

状态模式,客户端不需要知道状态,状态自动转换行为。

策略模式是对同一种行为的多种实现,一种实现就是一种策略。

状态模式关注的是根据不同状态转换行为。

问题3)策略模式实例?

这个模式涉及到三个角色:

  • 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。

  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。

  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

使用流程:策略接口,策略接口实现类,context引用策略接口,

调用入口context,传入策略实现类对象。调用具体的实现策略。

实例:

步骤 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;
}
}
OperationSubtract.java
public class OperationSubtract 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 OperationSubtract());      
  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



这篇关于【九月打卡】第17天+策略模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程