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

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


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


  1. 代码设计要依赖于抽象接口,不要依赖于具体实现。
  2. 通过面向抽象的编程方式来降低类之间的耦合,便于扩展。


反例示例:


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


UML类图:


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



相关文章
|
分布式计算 DataWorks 数据可视化
DataWorks常见问题之dataworks三个节点运行失败没法终止如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
CRM客户关系管理系统,企业销售管理好助手
CRM的核心价值在于以「客户/顾客」为中心,将相关资料与数据整合,分析客户/顾客的行为,帮助品牌与企业了解市场与客户的需求,从而制定适合的营运方针。企业需要CRM平台汇整与管理客户/顾客信息,让企业以数据驱动营运,通过完善、成熟的工具记录、分析客户信息,有效提升营收效益。
339 2
为什么商标申请越来越难了?
前几期我们聊过商标的缺显和误认,这次就来聊聊商标近似的知识。
1095 0
|
安全 API 开发者
PSCI接口规范(下)
PSCI接口规范(下)
|
存储 缓存 JavaScript
Vue.js与后端交互:构建动态数据应用的完美指南(下)
Vue.js与后端交互:构建动态数据应用的完美指南
|
缓存 JSON 安全
App 架构经验总结
架构因人而异,不同的架构师大多会有不同的看法;架构也因项目而异,不同的项目需求不同,相应的架构也会不同。然而,有些东西还是通用的,是所有架构师都需要考虑的,也是所有项目都会有的需求,比如API如何设计?架构如何分层?开发环境和生产环境如何分离?这几年,我负责研发过的App,有餐饮类的、社交类的、智能家居类的、电商类的、新闻媒体类的等等。当有了一定的经验之后,你总会有一些自己的心得体会。而以下内容就是根据我的这些经历提炼出来的关于以上几个问题方面的经验总结,内容不多,旨在抛砖引玉。
231 0
|
Cloud Native 自动驾驶 关系型数据库
阿里云连续3年跻身Gartner全球云数据库管理系统领导者象限
阿里云连续3年跻身Gartner全球云数据库管理系统领导者象限
380 0
|
前端开发 测试技术 API
PTS压测体验之博客文章列表
PTS压测体验之博客文章列表
378 0
PTS压测体验之博客文章列表
|
运维 Cloud Native 中间件
《边缘云技术演进与发展白皮书》——五、边缘云分布式云管系统技术演进——01 分布式云管架构演进—— 4.云管第四阶段:生态支撑
《边缘云技术演进与发展白皮书》——五、边缘云分布式云管系统技术演进——01 分布式云管架构演进—— 4.云管第四阶段:生态支撑
338 0