依赖倒置原则(Dependence Inversion Principle,DIP):
-
代码设计要依赖于抽象接口,不要依赖于具体实现。
-
通过面向抽象的编程方式来降低类之间的耦合,便于扩展。
反例示例:
| class LuckyDrawController { |
| prizeRandom(users: User[], count: number): User[] { |
| ... |
| } |
| |
| prizeWeight(users: User[], count: number): User[] { |
| ... |
| } |
| } |
UML类图:

代码实现:
| class User { |
| name: string; |
| level: number; |
| active: number; |
| constructor(name: string, level: number, active: number) { |
| this.name = name; |
| this.level = level; |
| this.active = active; |
| } |
| } |
抽奖接口:传入所有参加抽奖的用户,返回得奖的用户
| interface ILuckyDraw { |
| prize(users: User[], count: number): User[]; |
| } |
全随机抽奖类
| class RandomLuckyDraw implements ILuckyDraw { |
| prize(users: User[], count: number): User[] { |
| |
| const shuffleUsers = _.shuffle(users); |
| |
| return _.sampleSize(shuffleUsers, count); |
| } |
| } |
按权重抽象
| class WeightLuckyDraw implements ILuckyDraw { |
| prize(users: User[], count: number): User[] { |
| |
| const sortUsers = _.orderBy(users, ["level", "active"], ["desc", "desc"]); |
| |
| return _.take(sortUsers, count); |
| } |
| } |
运行示例:
| import { RandomLuckyDraw, WeightLuckyDraw, User } from "./DIP"; |
| |
| |
| let users = []; |
| for (let i = 0; i < 10; i++) { |
| const user = new User( |
| Mock.Random.cname(), |
| Mock.Random.integer(0, 10), |
| Mock.Random.integer(50, 100) |
| ); |
| users.push(user); |
| } |
| |
| |
| const randomLuckyDraw = new RandomLuckyDraw(); |
| const winners1 = randomLuckyDraw.prize(users, 3); |
| console.log(winners1); |
| |
| |
| const weightLuckyDraw = new WeightLuckyDraw(); |
| const winners2 = weightLuckyDraw.prize(users, 3); |
| console.log(winners2); |
【在线代码】:依赖倒置原则演示
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)