public void fightEnemy();
}
具体策略
我们定义三种策略,分别是美人计,苦肉计,借刀杀人计:
/**
- 三十六计之美人计
*/
public class HoneyTrapStrategy implements FightStrategy{
@Override
public void fightEnemy() {
System.out.println(“使用‘美人计’取得胜利”);
}
}
/**
- 三十六计之苦肉计
*/
public class SelfInjuryStrategy implements FightStrategy {
@Override
public void fightEnemy() {
System.out.println(“使用’苦肉计‘取得胜利”);
}
}
/**
- 三十六计之借刀杀人
*/
public class CollateralStrategy implements FightStrategy{
@Override
public void fightEnemy() {
System.out.println(“使用’借刀杀人‘取得胜利”);
}
}
环境角色
环境角色主要是持有一个具体的策略,我们使用构造器在初始化环境类时传入具体的策略
/**
- 环境角色-持有具体策略的引用
*/
public class StrategyContext {
private FightStrategy strategy;
public StrategyContext(FightStrategy strategy) {
this.strategy = strategy;
}
public void fight(){
this.strategy.fightEnemy();
}
}
客户端
/**
- 客户端需要根据具体的对手选择具体的策略
*/
public class FightClient {
public static void main(String[] args) {
FightClient client = new FightClient();
client.fightEnemy(“李四”);
}
private void fightEnemy(String enemyName) {
StrategyContext context = null;
switch (enemyName){
case “张三” :
context = new StrategyContext(new HoneyTrapStrategy());
break;
case “李四”:
context = new StrategyContext(new SelfInjuryStrategy());
break;
case “王二”:
context = new StrategyContext(new CollateralStrategy());
break;
}
context.fight();
}
}
执行结果
扩展
–
在上面例子中客户端需要承担根据敌人选择具体的策略职责,即上面的 case
语句的实现逻辑,把这样一大段代码放在客户端会造成客户端臃肿,影响阅读体验,我们有2种优化策略:
简单工厂
使用简单工厂方法,将选择策略的判断逻辑抽取到工厂类中,客户端传入 enemyName
给简单工厂生成具体策略,实现逻辑如下:
/**
-
简单工厂方法
-
根据敌人名称选择具体的策略
*/
public class StrategyFactory {
public static FightStrategy createFightStrategy(String enemyName){
FightStrategy strategy;
switch (enemyName){
case “张三” :
strategy = new HoneyTrapStrategy();
break;
case “李四”:
strategy = new SelfInjuryStrategy();
break;
case “王二”:
strategy = new CollateralStrategy();
break;
default:
throw new IllegalStateException("Unexpected value: " + enemyName);
}
return strategy;
}
}
接下来改造客户端,选择具体策略的方法使用简单工厂生成:
/**
- 使用简单工厂构建具体的策略
*/
public class FightClient {
public static void main(String[] args) {
FightClient client = new FightClient();
client.fightEnemy(“张三”);
}
private void fightEnemy(String enemyName) {
FightStrategy strategy = StrategyFactory.createFightStrategy(enemyName);
StrategyContext context = new StrategyContext(strategy);
context.fight();
}
}
策略与简单工厂结合
这里主要改造环境角色类,构造方法不再接收具体的策略对象,而是使用 enemyName
作为参数接收,让其拥有根据 enemyName
选择策略的能力,改造后的环境类如下:
/**
- 环境角色 结合简单工厂选择具体的策略
*/
public class StrategyContext {
private FightStrategy strategy;
public StrategyContext(String enemyName) {
switch (enemyName){
case “张三” :
strategy = new HoneyTrapStrategy();
break;
case “李四”:
strategy = new SelfInjuryStrategy();
break;
case “王二”:
strategy = new CollateralStrategy();
总结:绘上一张Kakfa架构思维大纲脑图(xmind)
其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?
若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理
梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。
-
Kafka入门
-
为什么选择Kafka
-
Kafka的安装、管理和配置
-
Kafka的集群
-
第一个Kafka程序
-
Kafka的生产者
-
Kafka的消费者
-
深入理解Kafka
-
可靠的数据传递
-
Spring和Kafka的整合
-
SpringBoot和Kafka的整合
-
Kafka实战之削峰填谷
-
数据管道和流式处理(了解即可)
学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。
-
Kafka入门
-
为什么选择Kafka
-
Kafka的安装、管理和配置
-
Kafka的集群
-
第一个Kafka程序
-
Kafka的生产者
-
Kafka的消费者
-
深入理解Kafka
-
可靠的数据传递
-
Spring和Kafka的整合
-
SpringBoot和Kafka的整合
-
Kafka实战之削峰填谷
-
数据管道和流式处理(了解即可)
[外链图片转存中…(img-B1plOe8r-1714283466008)]
[外链图片转存中…(img-mPcrm7Bd-1714283466008)]