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

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

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

      反例示例:

      ```typescript class LuckyDrawController { prizeRandom(users: User[], count: number): User[] { … }

    prizeWeight(users: User[], count: number): User[] { … } }

    1. <a name="RZUlP"></a>
    2. #### UML类图:
    3. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2373519/1630943417917-3f8ad98a-3c82-4bd2-a5ac-0308aeed9db8.png#clientId=u081cb84f-e5b0-4&from=paste&height=367&id=u0641dcfd&margin=%5Bobject%20Object%5D&name=image.png&originHeight=367&originWidth=926&originalType=binary&ratio=1&size=32422&status=done&style=none&taskId=ub4bdbd9a-a6f0-4f60-ab63-0511a6d78d8&width=926)
    4. <a name="d8iKe"></a>
    5. #### 代码实现:
    6. ```typescript
    7. class User {
    8. name: string; // 用户名
    9. level: number; // 会员等级
    10. active: number; // 活跃值
    11. constructor(name: string, level: number, active: number) {
    12. this.name = name;
    13. this.level = level;
    14. this.active = active;
    15. }
    16. }

    抽奖接口:传入所有参加抽奖的用户,返回得奖的用户
    1. interface ILuckyDraw {
    2. prize(users: User[], count: number): User[];
    3. }

    全随机抽奖类
    1. class RandomLuckyDraw implements ILuckyDraw {
    2. prize(users: User[], count: number): User[] {
    3. // 洗牌
    4. const shuffleUsers = _.shuffle(users);
    5. // 随机抽取三位用户
    6. return _.sampleSize(shuffleUsers, count);
    7. }
    8. }

    按权重抽象
    1. class WeightLuckyDraw implements ILuckyDraw {
    2. prize(users: User[], count: number): User[] {
    3. // 排序
    4. const sortUsers = _.orderBy(users, ["level", "active"], ["desc", "desc"]);
    5. // 抽取前三位
    6. return _.take(sortUsers, count);
    7. }
    8. }

    运行示例:

    ```typescript 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); ``` 【在线代码】:依赖倒置原则演示