课程名称:Java设计模式精讲 Debug方式+内存分析
课程章节:第19章 策略模式讲解+Coding+源码解析
主讲老师:Geely
课程内容:
策略模式:(相同行为,不同实现)
问题1)定义和uml图?
定义算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。
应用层调用不同的不同的算法,算法你封装到不同的类中。
场景:
促销策略:满减,等
问题2)使用场景
-
系统中有很多类,区别在于他们的行为不同。使用策略模式,动态的从许多行为中,选择一个行为,一个行为一个类,一个策略。
-
一个系统中存在多个算法,选择其中一个算法,就是选择其中一个策略。
优点:
-
开闭原则,不修改原有类,仅添加类。
-
避免多重if,else语句。
-
不需要关心策略的具体实现,只需要使用这个策略就可以。
缺点:
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
共同学习,写下你的评论
评论加载中...
作者其他优质文章