《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
抽象策略
首先定义所有计策的抽象类,所有策略的目的都是为了击败对手,定义公共方法 fightEnemy
/**
-
策略接口,定义所有的接口
-
@date 2019/5/22 9:50
*/
public interface FightStrategy {
/**
- 杀敌之法
*/
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();
break;
default:
throw new IllegalStateException("Unexpected value: " + enemyName);
}
}
public void fight(){
this.strategy.fightEnemy();
}
}
最后我们该如何学习?
1、看视频进行系统学习
这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。
另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:
2、读源码,看实战笔记,学习大神思路
“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。
Spring源码深度解析:
Mybatis 3源码深度解析:
Redis学习笔记:
Spring Boot核心技术-笔记:
3、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
ing Boot核心技术-笔记:
[外链图片转存中…(img-anCN3ljr-1714470842075)]
3、面试前夕,刷题冲刺
面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。
关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:
[外链图片转存中…(img-3zFzbBzv-1714470842075)]
只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。
人生短暂,别稀里糊涂的活一辈子,不要将就。
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!