远方的灯塔 - 专注于服务端技术分享 远方的灯塔 - 专注于服务端技术分享
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)

Terwer Green

一个后端老菜鸟
首页
  • Java SE
  • Struts2
  • Hibernate
  • MyBatis
  • JAX-WS
  • 并发
  • 分布式
  • Git
  • 文章分类
  • 文章标签
  • 文章归档
  • 《C程序设计语言》
心情随笔
友情链接
给我留言 (opens new window)
关于我
GitHub (opens new window)
  • JavaSE

  • 开源框架

  • Linux

  • Struts2

  • Hibernate

  • Webservice

  • 分布式

    • RPC架构设计及IO模型
    • NIO编程及其三大核心原理
    • NIO三大核心之缓冲区(Buffer)
    • NIO三大核心之通道(Channel)
    • NIO三大核心之选择器(Selector)
    • Netty核心原理
    • 线程模型以及传统IO阻塞模型
    • Reactor模型
    • Netty线程模型
    • Netty核心API介绍
    • Netty入门与异步模型
    • Netty高级进阶之Netty编解码器
    • Netty高级进阶之基于Netty的群聊天室案例
    • Netty高级进阶之基于Netty的HTTP服务器开发
    • Netty高级进阶之基于Netty的Websocket开发网页聊天室
    • Netty高级进阶之Netty中的粘包和拆包的解决方案
    • Nety源码剖析
    • 自定义RPC框架之分布式架构网络通信理论
    • 自定义RPC框架之基于Netty实现RPC框架
    • 分布式架构理论
    • 分布式理论之数据一致性
    • 分布式理论之CAP定理
    • 分布式理论之BASE定理
    • 分布式一致性协议之两阶段提交协议(2PC)
    • 分布式一致性协议之三阶段提交协议(3PC)
    • 分布式一致性协议之NWR协议
    • 分布式一致性协议之Gossip协议
    • 分布式一致性协议之Paxos协议
    • 分布式一致性协议之Raft协议
    • 分布式一致性协议之Lease机制
    • 分布式系统设计策略之心跳检测
    • 分布式系统设计策略之高可用
    • 分布式系统设计策略之容错性
    • 分布式系统设计策略之负载均衡
    • 分布式架构服务调用
    • 分布式服务治理之服务协调
    • 分布式服务治理之服务削峰
    • 分布式服务治理之服务降级
    • 分布式服务治理之服务限流
    • 分布式服务治理之服务熔断
    • 分布式服务治理之服务链路追踪
    • 架构设计基本原则之开闭原则(OCP)
    • 架构设计基本原则之单一职责原则(SRP)
    • 架构设计基本原则之接口隔离原则(ISP)
    • 架构设计基本原则之里式替换原则(LSP)
    • 架构设计基本原则之依赖倒置原则(DIP)
    • 架构设计基本原则知识扩展
      • SOLID原则
      • 迪米特原则(LOD)
        • 迪米特法则的定义
        • 迪米特法则的优点
        • 迪米特法则的实现方法
      • 合成复用原则
        • 合成复用原则的定义
        • 合成复用原则的重要性
        • 复用合成原则的实现
    • 分布式架构知识拓展与总结
  • 分布式框架

  • 后端开发
  • 分布式
terwer
2022-05-04
目录

架构设计基本原则知识扩展

# 架构设计基本原则知识扩展

# SOLID原则

前五种统一称为SOLID原则

SOLID(单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期 引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。 当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软件维护和扩展的系统变得更加可能。

https://en.wikipedia.org/wiki/SOLID (opens new window)

# 迪米特原则(LOD)

LOD, Law of Demeter, 迪米特原则 or LKP, Least Knowledge Principle, 最少知识原则

参考

https://www.cnblogs.com/gaochundong/p/least_knowledge_principle.html (opens new window)

# 迪米特法则的定义

软件实体之间无需直接通信,那么就不应该发生直接相互调用,可以通过第三方转发该调用。其目的是降低耦合性,提高模块的独立性。

# 迪米特法则的优点

限制软件实体间通信的宽度和深度,优点如下:

  1. 降低了软件之间的耦合,提高了模块的独立性
  2. 提高了类可复用性和系统额可扩展性

# 迪米特法则的实现方法

迪米特法则强调两点:

  1. 从依赖的角度来说,只依赖该依赖的对象。
  2. 从被依赖这来说,只暴露该暴露的方法。

明星和经纪人案例实例

image-20220416013406846

/**
 * 经纪人
 *
 * @name: Agent
 * @author: terwer
 * @date: 2022-04-16 01:37
 **/
public class Agent {
    private Star myStar;
    private Fans myFans;
    private Company myCompany;

    public void setStar(Star myStar) {
        this.myStar = myStar;
    }

    public void setFans(Fans myFans) {
        this.myFans = myFans;
    }

    public void setCompany(Company myCompany) {
        this.myCompany = myCompany;
    }

    public void meeting() {
        System.out.println(myFans.getName() + "与明星" + myStar.getName() + "见面了。");
    }

    public void business() {
        System.out.println(myCompany.getName() + "与明星" + myStar.getName() + "洽淡业务。");
    }
}

/**
 * 公司
 *
 * @name: Company
 * @author: terwer
 * @date: 2022-04-16 02:08
 **/
public class Company {
    private String name;

    Company(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

/**
 * 粉丝
 *
 * @name: Fans
 * @author: terwer
 * @date: 2022-04-16 02:07
 **/
public class Fans {
    private String name;

    Fans(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

/**
 * 明星
 *
 * @name: Star
 * @author: terwer
 * @date: 2022-04-16 02:06
 **/
//明星
public class Star {
    private String name;

    Star(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class Main {
    public static void main(String[] args) {
        Agent agent = new Agent();
        agent.setStar(new Star("小马"));
        agent.setFans(new Fans("粉丝小李"));
        agent.setCompany(new Company("中国传媒有限公司"));
        agent.meeting();
        agent.business();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

# 合成复用原则

# 合成复用原则的定义

合成复用原则(Composite Reuse Principle,CRP),又叫组合/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)。

要求软件复用时候,尽量先用组合和聚合关系,其次才考虑使用继承关系来实现。

如果使用继承,必须严格遵守里氏替换原则。

合成复用原则和里氏替换原则是相辅相成的,两者都是开闭原则的具体实现规范。

# 合成复用原则的重要性

类的复用分为继承复用和合成复用两种,继承复用简单易实现,但是有缺点:

  1. 继承复用破坏了类的封装性。
  2. 子类与父类耦合度高。
  3. 限制了复用的灵活性。

采用合成复用原则,可以将已有对象纳入到新对象中,成为新对象的一部分,新对象调用已有对象功能,有以下优点:

  1. 维持了类的封装性。
  2. 新旧类的耦合度低。
  3. 复用灵活性高

# 复用合成原则的实现

以汽车管理程序为例:

需求:汽车按照动力源分为汽油汽车、电动汽车。按颜色划分为白色汽车、黑色汽车等。它们可能产生以下组合:

image-20220416095553638

可以看到,采用继承会产生很多的子类,并且新增动力源和颜色都要修改代码违背了开闭原则。

采用组合模式可以很好的解决:

image-20220416095947434

Aaa

编辑 (opens new window)
#arch#desgin#lod#crp#composite#reuse
上次更新: 2023/02/22, 13:47:25
架构设计基本原则之依赖倒置原则(DIP)
分布式架构知识拓展与总结

← 架构设计基本原则之依赖倒置原则(DIP) 分布式架构知识拓展与总结→

最近更新
01
解决css部分border被圆角切掉之后圆角的边框消失问题
03-18
02
使用TypeScript开发一个自定义的Node-js前端开发脚手架
03-08
03
Github-Actions使用release-please实现自动发版
03-06
更多文章>
Theme by Vdoing | Copyright © 2011-2023 Terwer Green | MIT License | 粤ICP备2022020721号-1 | 百度统计
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式