个人看书理解,主要是写代码实操,方便以后复习,而不是文字性的东西
开闭原则OCP
-
定义
对扩展开放,对修改关闭。
用抽象构建框架,用实现扩展细节,核心思想是面向抽象。
禁止修改上曾的抽象,但是可以用继承拓展底层的实现功能 -
目的
不修改源代码,灵活拓展新功能
代码
interface IA {
void doIA();
}
interface IB {
void doIB();
}
class CA implements IA {
@Override
public void doIA() {
}
}
class CB extends CA implements IB {
@Override
public void doIA() {
// super.doA();
//TODO 修改的逻辑
}
@Override
public void doIB() {
}
}
当需要对CA的功能进行修改时,为确保不影响其他使用CA的模块,应该使用CB继承CA同事实现新的功能拓展接口IB。IB的接口即为抽象出来的拓展功能接口
依赖倒置原则DIP
-
定义
高层模块不依赖底层模块,而是都依赖于其抽象
抽象不依赖细节,细节依赖抽象 -
目的
降低类之间的耦合性
代码
interface IA {
void doIA();
}
class CA implements IA {
@Override
public void doIA() {
}
}
class CB implements IA {
@Override
public void doIA() {
}
}
class Client {
private IA ia;
//构造注入
public Client(IA ia) {
this.ia = ia;
}
//setter注入
public void setIa(IA ia) {
this.ia = ia;
}
void doClient() {
ia.doIA();
}
public static void main(String[] args) {
//构造注入
Client client = new Client(new CA());
client.doClient();
//setter注入
client.setIa(new CB());
client.doClient();
}
}
面向接口变成,先顶层抽象,再具体细节,
单一职责原则SRP
- 定义
一个Class、Interface、Method只负责一项职责,如果类变更应该也只存在单个职责原因变更 - 目的
降低类的复杂度、提高可读性、可维护性
代码
interface IA{
void doIA();
}
interface IB{
void doIB();
}
class CA implements IA,IB{
@Override
public void doIA() {
}
@Override
public void doIB() {
}
}
类的单一职责收到依赖、组合、聚合等关系的影响很难保证单一职责,
应让接口、方法等抽象和细节保证单一职责
接口隔离原则ISP
- 定义
应使用多个接口、不应使用单一的总接口、不依赖不需要的接口
类的依赖建立在最小接口上
建立单一接口
细化接口、减少接口的方法,这建立在业务的抽象理解上 - 目的
具有高内聚、低耦合、可读性、可扩展性、可维护性
代码
interface WalkRebot {
void doWale();
}
interface JobRebot {
void doJob();
}
interface DriveRebot {
void doDrive();
}
class MyRobot implements WalkRebot, JobRebot, DriveRebot {
@Override
public void doWale() {
}
@Override
public void doJob() {
}
@Override
public void doDrive() {
}
}
其要求有更高的抽象性,将共性、非共性的特征抽象出来
迪米特法则LoD
- 定义
最少知道原则LKP,对象之间应保持最少的了解 - 目的
降低对象和对象、类和类之间的耦合性,禁止滥用继承
代码
class CA {
void doCA() {
//doSomething
}
}
class CB {
void doCB() {
//doSomething
new CA().doCA();
}
}
class CC {
void doCC() {
new CB().doCB();
}
}
class Client {
public static void main(String[] args) {
new CC().doCC();
}
}
客户端只需要CC去执行方法,而不用去关注CC是怎么去执行的,CC和CA是解耦的
里氏替换原则LSP
- 定义
如果适用于父类,则一定适用于子类,所有引用父类的地方都可以使用其子类对象,子类对象可以替换父类对象而保持逻辑不变
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
2.子类可以增加自己的方法
3.子类的重写父类方法时,其条件必须不能比父类严格,可以宽松
合成复用原则CARP
- 定义
尽量使用对象组合、聚合实现代码复用,其优先级高于继承
1.组合聚合可以使类与类耦合度降低
2.继承把细节暴露给子类,增加了代码复杂度 - 目的
降低耦合度
代码
class CA implements IA {
@Override
public void doIA() {
}
}
class CB implements IA {
@Override
public void doIA() {
}
}
class Client {
private IA ia;
public Client(IA ia) {
this.ia = ia;
}
public void doClient() {
ia.doIA();
}
}
Comments | 0 条评论