Linuxgit入门设计模式(常考点)
Git
学习资源:Git教程 - 廖雪峰的官方网站
摸清 Git 的门路,就靠这 22 张图
git init 初始化仓库
git clone 克隆仓库
git config user.name 查看用户名
git config user.email 查看邮箱
git add 添加到暂存区
git commit -m "成功添加2个文件“ 添加到本地仓库
git status 查看当前仓库以及文件的状态
git diff 查看文件具体是怎么修改的
git reset 回退到上个版本
--hard已提交状态,--soft未提交状态 +前7位git checkout -- a.txt 让这个文件回到最近一次
git commit或git add时的状态git rm a.txt 暂存区删除,如果commit就真的删了
git log 看日志,按q退出
git remote add ogrigin 首次添加远程仓库
git remote set-url ogrigin 重写设置远程仓库
git clone 直接clone远程仓库的东西
git branch dev 创建分支dev
git checkout dev 切换到分支dev
git branch 查看当前分支
git merge dev dev合并到当前分支上
git branch -d dev 删除dev分支
git switch -c feacher 切换到分支feacher(第二种写法)
git switch master 切换到master分支(第二种写法)
git merge --no-ff 保留合并分支历史
git stach 暂时存储状态
git stach list 查看存储列表
git stach apply stach@{0} 恢复指定的stach
git stash drop stash@{0} 删除编号为 0 的 stash
git cherry-pick 获取另一个分支上某次更改的代码
git push <远程仓库名称> <分支名>
git pull 拉取
git fetch origin 拉取分支列表
git checkout -b dev origin/dev 创建dev分支并与origin/dev绑定git branch -- set-upstream-to <branch-name> origin/<branch-name> 本地与远程分支绑定
git tag <tagname> 打标签
idea实操流程:
先clone远程仓库代码,然后打开idea,基于master新建分支(比如feature)。
写完后push and commit (同名远程分支) ,如果冲突了可以merge(此刻会把你本地的代码也更新)。
如果merge冲突了会弹窗,则沟通后选择一个使用,再push。
如果远程master更新了先本地master更新(常说的先pull一下),再切换会自己的分支将master代码merge过来。(有冲突再解决)
面试题:
git熟练吗?
git是版本控制工具,通常分为工作区,本地仓库、暂存区、远程仓库
我们开发首先用git pull拉取远程仓库代码,然后开发完用git add将代码存到暂存区,git commit提交到本地仓库,git push推送到远程仓库。
如果想撤回commit的修改可以使用git reset 命令撤回,如果想撤回push的修改,那我们再git reset 后再git push --force强制修改即可回退。
rebase和merge的区别
Rebase(变基)是将一个分支上的提交逐个地应用到另一个分支上,使得提交历史变得更加线性。
Merge(合并)是将两个分支上的代码提交历史合并为一个新的提交。在执行merge时,Git会创建一个新的合并提交,合并后的历史会保留每个分支的提交记录
不过我们通常还是用merge,它的历史记录更加直观一些
git冲突了怎么解决
我们用git status查看冲突状态,然后修改冲突文件,再add commit即可
Linux
常用命令
- top 用来查看系统资源
ps -ef | grep java查看 Java 进程netstat-nap 查看网络连接- ping 测试网络连通性
- chmod 修改文件权限
- kill 终止进程
- df 查看磁盘空间
- mkdir 创建目录、rm 删除文件、cp 复制文件、mv 移动文件
- zip 压缩文件、unzip 解压文件等等这些。
文件操作
ls:列出目录内容。ls -l显示详细信息,ls -a显示隐藏文件。cd:更改当前目录。cd ..回到上级目录,cd ~回到用户的主目录。pwd:显示当前工作目录的完整路径。mkdir:创建新目录。find:在目录树中查找文件。find /directory/ -name filename。cat:查看文件内容
rm 文件名/目录名
删除文件/目录
cp 文件名 目录名
复制文件到指定目录
mv 文件名 目录名
移动文件到指定目录
vim 或 vi 文件名
编辑文件
系统操作
ps:显示当前运行的进程。ps aux显示所有进程。top:实时显示进程动态。kill:终止进程。kill -9 PID强制终止。df:显示磁盘空间使用情况。df -h以易读格式显示
网络管理
ping:检查与远程服务器的连接。ifconfig:显示网络接口的配置信息。netstat:显示网络连接、路由表和网络接口信息
压缩和解压
tar:打包或解包.tar文件。tar cvf archive.tar files打包,tar xvf archive.tar解包。gzip/gunzip:压缩或解压.gz文件。zip/unzip:压缩或解压.zip文件
设计模式
参考资料:柏码知识库 | 设计模式
单例:只有一个实例对象
饿汉式,在一开始类加载时就创建好了
public class Singleton {private final static Singleton INSTANCE = new Singleton(); //用于引用全局唯一的单例对象,在一开始就创建好private Singleton() {} //不允许随便new,需要对象直接找getInstancepublic static Singleton getInstance(){ //获取全局唯一的单例对象return INSTANCE;}
}
懒汉式,在方法中进行的初始
public class Singleton {private static volatile Singleton INSTANCE; //在一开始先不进行对象创建private Singleton() {} //不用多说了吧public static Singleton getInstance(){ //将对象的创建延后到需要时再进行if(INSTANCE == null) { //如果实例为空,那么就进行创建,不为空说明已经创建过了,那么就直接返回synchronized(Singleton.class){// 第二次校验:防止多线程等待锁时,已有线程创建实例if (INSTANCE == null) {INSTANCE = new Singleton(); // volatile 禁止指令重排,避免拿到未初始化的实例}}}return INSTANCE;}
}
简单工厂模式:通过工厂来获取不同的产品,但不满足开放封闭的设计原则,增添功能时要改源码
public class FruitFactory {public static Fruit getFruit(String type) {switch (type) {case "苹果":return new Apple();case "橘子":return new Orange();default:return null;}}
}
工厂方法模式:通过创建一个抽象工厂,每种对象单独继承它写一个工厂来返回对象,创建对象只需要调用对应工厂的方法即可
public abstract class FruitFactory<T extends Fruit> { //将水果工厂抽象为抽象类,添加泛型T由子类指定水果类型public abstract T getFruit(); //不同的水果工厂,通过此方法生产不同的水果
}
public class AppleFactory extends FruitFactory<Apple> { //苹果工厂,直接返回Apple,一步到位@Overridepublic Apple getFruit() {return new Apple();}
}
代理:代理类和被代理的类都实现同一个接口/抽象类,并在原有方法前后执行相关操作
public class Proxy extends Subject{ //为了保证和Subject操作方式一样,保证透明性,也得继承Subject target; //被代理的对象(甚至可以多重代理)public Proxy(Subject subject){this.target = subject;}@Overridepublic void test() { //由代理去执行被代理对象的方法,并且我们还可以在前后添油加醋System.out.println("代理前绕方法");target.test();System.out.println("代理后绕方法");}
}
策略:给定几种选择,根据实际需求调用其中的一种
public interface Strategy { //策略接口,不同的策略实现也不同Strategy SINGLE = Arrays::sort; //单线程排序方案Strategy PARALLEL = Arrays::parallelSort; //并行排序方案void sort(int[] array);
}
模板方法:具体要完成的方法定义,实现交由子类完成
public abstract class AbstractDiagnosis {public void test(){System.out.println("去医院看病了~"); //由于现在不知道该开什么处方,所以只能先定义一下行为,然后具体由子类实现//大致的流程先定义好就行this.prescribe();this.medicine(); //开药同理}public abstract void prescribe(); //开处方操作根据具体病症决定了public abstract void medicine(); //拿药也是根据具体的处方去拿
}
责任链:通过将任务一级一级不断向下传递,来对我们所需要的任务进行过滤和处理。
public abstract class Handler {protected Handler successor; //这里我们就设计责任链以单链表形式存在,这里存放后继节点public Handler connect(Handler successor){ //拼接后续节点this.successor = successor;return successor; //这里返回后继节点,方便我们一会链式调用}public void handle(){this.doHandle(); //由不同的子类实现具体处理过程Optional.ofNullable(successor).ifPresent(Handler::handle); //责任链上如果还有后继节点,就继续向下传递}public abstract void doHandle();
}
观察者:对象发生改变时,观察者能够立即观察到并进行一些联动操作
public class Subject {private final Set<Observer> observerSet = new HashSet<>();public void observe(Observer observer) { //添加观察者observerSet.add(observer);}public void modify() { //模拟对象进行修改observerSet.forEach(Observer::update); //当对象发生修改时,会通知所有的观察者,并进行方法回调}
}
