2024年Java最新Day316,阿里P8大牛手把手教你

最后我们该如何学习?

1、看视频进行系统学习

这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

2、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

Spring源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Mybatis 3源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Redis学习笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Spring Boot核心技术-笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

public class Client {

public static void main(String[] args) {

//制作红豆豆浆

System.out.println(“----制作红豆豆浆----”);

SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();

redBeanSoyaMilk.make();

System.out.println(“---- 制 作 花 生 豆 浆 ----”);

SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();

peanutSoyaMilk.make();

}

}

PeanutSoyaMilk

public class PeanutSoyaMilk extends SoyaMilk {

@Override

void addCondiments() {

System.out.println(" 加入上好的花生 ");

}

}

RedBeanSoyaMilk

public class RedBeanSoyaMilk extends SoyaMilk {

@Override

void addCondiments() {

System.out.println(" 加入上好的红豆 ");

}

}

SoyaMilk抽象类

//抽象类,表示豆浆

public abstract class SoyaMilk {

//模板方法, make ,

//模板方法可以做成 final , 不让子类去覆盖重写

final void make() {

select();

addCondiments();

soak();

beat();

}

//选材料

void select() {

System.out.println("第一步:选择好的新鲜黄豆 ");

}

//添加不同的配料, 抽象方法, 子类具体实现

abstract void addCondiments();

//浸泡

void soak() {

System.out.println("第三步, 黄豆和配料开始浸泡, 需要 3 小时 ");

}

void beat() {

System.out.println("第四步:黄豆和配料放到豆浆机去打碎 ");

}

}

五、模板方法模式的钩子方法


  1. 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。

2)还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造

  • 代码

//抽象类,表示豆浆

public abstract class SoyaMilk {

//模板方法, make

//模板方法可以做成 final , 不让子类去覆盖.

final void make() {

select();

if(customerWantCondiments()) {

addCondiments();

}

soak();

beat();

}

//选材料

void select() {

System.out.println("第一步:选择好的新鲜黄豆 ");

}

//添加不同的配料, 抽象方法, 子类具体实现

abstract void addCondiments();

//浸泡

void soak() {

System.out.println("第三步, 黄豆和配料开始浸泡, 需要 3 小时 ");

}

void beat() {

System.out.println("第四步:黄豆和配料放到豆浆机去打碎 ");

}

//钩子方法,决定是否需要添加配料

boolean customerWantCondiments() {

return true;

}

}

六、模板方法模式的注意事项和细节


1)基本思想

算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改

2)实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。

3)既统一了算法,也提供了很大的灵活性

父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。

4)该模式的不足之处:

每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大

5)一般模板方法都加上final 关键字, 防止子类重写模板方法.

6)模板方法模式使用场景:

当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理


命令模式

==============================================================

一、智能生活项目需求


看一个具体的需求

image-20210702203204437

1)我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装 app 就可以控制对这些家电工作。

2)这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个 App,分别控制,我们希望只要一个 app

就可以控制全部智能家电。

3)要实现一个 app 控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口给 app 调用,这时 就可以考虑使用命令模式。

4)命令模式可将 “动作的请求者”从“动作的执行者”对象中解耦出来.

5)在我们的例子中,动作的请求者是手机 app,动作的执行者是每个厂商的一个家电产品

二、命令模式基本介绍


1)命令模式(Command Pattern):

在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计

2)命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦

3)在命名模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命名),同时命令模式也支持可撤销的操作。

4)通俗易懂的理解:

将军发布命令,士兵去执行。其中有几个角色:将军(命令发布者)、士兵(命令的具体执行者)、命令(连接将军和士兵)。Invoker 是调用者(将军),Receiver 是被调用者(士兵),MyCommand 是命令,实现了 Command 接口,持有接收对象

三、 命令模式的原理类图


image-20210702221715800

  • 对原理类图的说明-即(命名模式的角色及职责)

1)Invoker 是调用者角色

2)Command: 是命令角色,需要执行的所有命令都在这里,可以是接口或抽象类

3)Receiver: 接受者角色,知道如何实施和执行一个请求相关的操作

4)ConcreteCommand: 将一个接受者对象与一个动作绑定,调用接受者相应的操作,实现 execute

四、命令模式解决智能生活项目


  • 应用实例要求

1)编写程序,使用命令模式 完成前面的智能家电项目

2)思路分析和图解

image-20210702224329106

3)代码实现

主函数

public class Client {

public static void main(String[] args) {

//使用命令设计模式,完成通过遥控器,对电灯的操作

//创建电灯的对象(接受者)

LightReceiver lightReceiver = new LightReceiver();

//创建电灯相关的开关命令

LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);

LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);

//需要一个遥控器

RemoteController remoteController = new RemoteController();

//给我们的遥控器设置命令, 比如 no = 0 是电灯的开和关的操作

remoteController.setCommand(0, lightOnCommand, lightOffCommand);

System.out.println(“--------按下灯的开按钮-----------”); remoteController.onButtonWasPushed(0);

System.out.println(“--------按下灯的关按钮-----------”); remoteController.offButtonWasPushed(0);

System.out.println(“--------按下撤销按钮-----------”); remoteController.undoButtonWasPushed();

System.out.println(“=使用遥控器操作电视机==”);

TVReceiver tvReceiver = new TVReceiver();

TVOffCommand tvOffCommand = new TVOffCommand(tvReceiver);

TVOnCommand tvOnCommand = new TVOnCommand(tvReceiver);

//给我们的遥控器设置命令, 比如 no = 1 是电视机的开和关的操作

remoteController.setCommand(1, tvOnCommand, tvOffCommand);

System.out.println(“--------按下电视机的开按钮-----------”);

remoteController.onButtonWasPushed(1);

System.out.println(“--------按下电视机的关按钮-----------”); remoteController.offButtonWasPushed(1);

System.out.println(“-------- 按 下 撤 销 按 钮 -----------”);

remoteController.undoButtonWasPushed();

}

}

Command

//创建命令接口

public interface Command {

//执行动作(操作)

public void execute();

//撤销动作(操作)

public void undo();

}

LightOffCommand

public class LightOffCommand implements Command {

// 聚合关系

LightReceiver light;

// 构造器

public LightOffCommand(LightReceiver light) {

super();

this.light = light;

}

@Override

public void execute() {

// 调用接收者的方法

light.off();

}

@Override

public void undo() {

// 调用接收者的方法

light.on();

}

}

LightOnCommand

public class LightOnCommand implements Command {

//聚合关系

LightReceiver light;

//构造器

public LightOnCommand(LightReceiver light) {

super();

this.light = light;

}

@Override

public void execute() {

//调用接收者的方法

light.on();

}

@Override

public void undo() {

//调用接收者的方法

light.off();

}

}

LightReceiver

public class LightReceiver {

public void on() {

System.out.println(" 电灯打开了… ");

}

public void off() {

System.out.println(" 电灯关闭了… ");

}

}

言尽于此,完结

无论是一个初级的 coder,高级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

image

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

image

搜集费时费力,能看到此处的都是真爱!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

级的程序员,还是顶级的系统架构师,应该都有深刻的领会到设计模式的重要性。

  • 第一,设计模式能让专业人之间交流方便,如下:

程序员A:这里我用了XXX设计模式

程序员B:那我大致了解你程序的设计思路了

  • 第二,易维护

项目经理:今天客户有这样一个需求…

程序员:明白了,这里我使用了XXX设计模式,所以改起来很快

  • 第三,设计模式是编程经验的总结

程序员A:B,你怎么想到要这样去构建你的代码

程序员B:在我学习了XXX设计模式之后,好像自然而然就感觉这样写能避免一些问题

  • 第四,学习设计模式并不是必须的

程序员A:B,你这段代码使用的是XXX设计模式对吗?

程序员B:不好意思,我没有学习过设计模式,但是我的经验告诉我是这样写的

[外链图片转存中…(img-BDix8ERv-1714906766366)]

从设计思想解读开源框架,一步一步到Spring、Spring5、SpringMVC、MyBatis等源码解读,我都已收集整理全套,篇幅有限,这块只是详细的解说了23种设计模式,整理的文件如下图一览无余!

[外链图片转存中…(img-Z2iCDLs2-1714906766366)]

搜集费时费力,能看到此处的都是真爱!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值