JS面向对象的七大基本原则(里氏替换/依赖倒置)

本文通过动物园动物表演的例子,深入浅出地讲解了里氏替换和依赖倒置两大面向对象设计原则,展示了如何通过抽象基类定义统一的行为标准,使系统更加灵活和可扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

里氏替换及依赖倒置

class Zoo {
    constructor () {
        
    }
    open () {
        //我要提前准备好多小动物,并设置好每个小动物的名字及它们的表演节目
        let cat = new Cat('猫')
        console.log(cat.catName + cat.canJump());
        let dog = new Dog('狗')
        console.log(dog.dogName + dog.canSing());
    }
}

class Cat {
    constructor (name) {
        this.catName = name;
    }
    canJump () {
        return '能跳'
    }
}
class Dog {
    constructor (name) {
        this.dogName = name;
    }

    canSing () {
        return '能唱'
    }
}

let zoo  = new Zoo();
zoo.open();

每个小动物都是那么的独特,我要记住他们所有的名字和行为,如果他们的名字和行为发生变化的时候,我就要去修改open方法, 如果来的新的小动物,我还得修改open。

如果我能发出口令“name”,他们就能爆出各自的名字,口令“show” 他们就能表演多好啊, 我要去训练他们,

class Zoo {
    constructor () {
        
    }
    open () {
        //我要提前准备好多小动物,并设置好每个小动物的名字及它们的表演节目
        let cat = new Cat('猫')
        console.log(cat.name + cat.show());
        let dog = new Dog('狗')
        console.log(dog.name + dog.show());
    }
}

class Cat {
    constructor (name) {
        this.name = name;
    }
    show () {
        return '能跳'
    }
}
class Dog {
    constructor (name) {
        this.name = name;
    }

    show () {
        return '能唱'
    }
}

let zoo  = new Zoo();
zoo.open();

嗯, 好多了, 我不用记住它们独特的名字和行为了,我为他们定义了统一的标准,要求他们听到name就返回名字,听到show就表演行为

我总结出了一个规律,所有带name属性,有show方法的动物都能来动物园,所以我只需要为所有的动物指定一个标准就行了,然后让所有的动物都能遵守它。

class Zoo {
    constructor () {
        
    }
    open (...animals) {
        //我要提前准备好多小动物,并设置好每个小动物的名字及它们的表演节目
        for(let animal of animals) {
            if (animal instanceof Animal) {
                console.log(animal.name, animal.show())
            } else {
                console.log('你不听我的话,我不要你')
            }
        }
    }
}

class Animal {
    constructor (name) {
        this.name = name;
    }

    show () {

    }
}
class Cat extends Animal{
    constructor (name) {
        super(name)
    }
    show () {
        return '能跳'
    }
}
class Dog extends Animal{
    constructor (name) {
        super(name)
    }

    show () {
        return '能唱'
    }
}

let zoo  = new Zoo();
zoo.open(new Cat('猫'), new Dog('狗'));

我指定的标准就是Animal, 它就是一个抽象, 我在动物园的open中不在依赖Cat/Dog而是依赖Animal,这就是依赖倒置,而Cat/Dog对于show方法的实现就是里氏替换

 

转载于:https://www.cnblogs.com/pandapeter/p/10441365.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值