漫谈Java设计模式的六大原则

System.out.println(“car move”);

}

private void load() {

System.out.println(“car load”);

}

}

这样一来,Car有两个功能,一个是move,一个是load。

那么问题来了,如果需要修改move的时候,Car这个类就会变动,修改load的时候,Car这个类也会变动。

那Car这个类是否可以拆分成两个类呢?答案是是的。

还有Car如果依赖了其它类,比如:

public class Car {

private Driver driver;

private void init() {

driver = new Driver();

}

private void move() {

System.out.println(“move”);

}

}

比如给这辆车配备司机,开始对司机进行初始化。但是Driver这个类的初始化,本身不应该在Car这个类里面进行。也就是说,Car这个类没有职责去初始化依赖的Driver类(可以用工厂模式等去实现)。

所以像Dagger2这样的框架解决的就是这类单一职责问题。

里氏替换原则(Liskov Substitution Principle)

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

Functions that use use pointers or references to base classes must be able to use objects of derived classes without knowing it.

对象:子类和父类

简而言之,里氏替换原则说明的是:子类可以对父类进行扩展,但是不能改变父类现有的功能。

具体就是:

1、子类继承父类后,可以扩展父类功能;

2、子类可以实现父类抽象方法,但是不能覆盖父类已实现的方法;

还是拿Car这个类来说,现在有Benz子类继承Car这个类:

public class Benz extends Car {

private void move() {

System.out.println(“benz move”);

}

}

如果我们进行如下调用:

public class Client{

public static void main(String[] args) {

Car car = new Car();

car.move();

Car car = new Benz();

car.move();

}

}

输出的结果是:

car move

move benz

为什么说这样的输出是不符合规则的呢?

因为move()这个功能已经由父类Car实现了,子类只需要继承就可以自动获得这个功能,但是由于某些功能、需求的升级或变更,开发人员在子类对父类方法进行了重写,也就是覆盖了父类方法。这样就导致在子类中调用父类的方法实际上已经被改动了。这种情况会造成不可预估的错误,不建议这么做。

解决方案:

之类增加自己特有的方法,不用覆盖父类方法的实现,

比如:

public class Benz extends Car {

private void newMove() {

System.out.println(“benz move”);

}

}

依赖倒置原则(Dependence Inversion Principle)

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

High level modules should not depend upon low level modules. Both should depend upon abstractions. Abstractions should not depend upon details. Details should depend upon abstractions

对象:模块之间

底层模块:原子逻辑,不可分割的业务逻辑;

高层模块:原子逻辑的封装;

abstractons:接口或抽象类,不能被直接实例化;

details:接口或抽象类的实例化;

说白了就是“面向接口编程”。

举例来说,Benz这个车由司机来开车,这里我们把司机叫做Zhangsan,

public class Benz {

public void move(Zhangsan zhangsan) {

System.out.println(“driver is zhangsan”);

}

}

public class Client{

public static void main(String[] args) {

Benz benz = new Benz();

Zhangsan zhangsan = new Zhangsan();

benz.move(zhangsan);

}

}

我们可以看到Benz车子配备了一个叫做Zhangsan的司机,而且只能由叫做张三的司机来驾驶。

万一哪天Zhangsan请假了怎么办,这辆Benz岂不是就开不了了么?

我们知道,只要拥有C驾照以上的驾驶员均可开Benz车,那么Benz的drive方法中就不能限制只对Zhangsan这个驾驶员有效。

我们定义一个接口,这个接口有个granted方法,任何实现了这个方法的驾驶员都有权限开Bens。

public interface ILicense {

void granted();

}

public class Lisi implements ILicense{

public boolean granted() {

System.out.println(“driver with license”);

return true;

}

}

这辆Benz不再只由Zhangsan驾驶:

public class Benz {

public void move(ILicense license) {

if(license.granted()) {

}

}

}

Lisi也能开了:

public class Client{

public static void main(String[] args) {

Benz benz = new Benz();

ILicense license = new Lisi();

benz.move(license);

}

}

接口隔离原则(Interface Segregation Principle)

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

最后

面试前一定少不了刷题,为了方便大家复习,我分享一波个人整理的面试大全宝典

  • Java核心知识整理

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

Java核心知识

  • Spring全家桶(实战系列)

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

  • 其他电子书资料

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

2020年五面蚂蚁、三面拼多多、字节跳动最终拿offer入职拼多多

g-Swc8Lc2R-1714753905777)]

Java核心知识

  • Spring全家桶(实战系列)

[外链图片转存中…(img-OiFh15kA-1714753905778)]

  • 其他电子书资料

[外链图片转存中…(img-S4v8p0e9-1714753905778)]

Step3:刷题

既然是要面试,那么就少不了刷题,实际上春节回家后,哪儿也去不了,我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

以下是我私藏的面试题库:

[外链图片转存中…(img-cn4CA0ic-1714753905778)]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值