【程序设计】6大设计原则之依赖倒置

依赖倒置原则(Dependence Inversion Principle,DIP):

  1. 代码设计要依赖于抽象接口,不要依赖于具体实现。

  2. 通过面向抽象的编程方式来降低类之间的耦合,便于扩展。

反例示例:

class LuckyDrawController {
prizeRandom(users: User[], count: number): User[] {
...
}
prizeWeight(users: User[], count: number): User[] {
...
}
}

UML类图:

image.png

代码实现:

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);

【在线代码】:依赖倒置原则演示

posted @   前端小鑫同学  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示