zoukankan      html  css  js  c++  java
  • JS面向对象的七大基本原则(里氏替换/依赖倒置)

    里氏替换及依赖倒置

    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方法的实现就是里氏替换

  • 相关阅读:
    UVA1349 Optimal Bus Route Design 最优巴士路线设计
    POJ3565 Ants 蚂蚁(NEERC 2008)
    UVA1663 Purifying Machine 净化器
    UVa11996 Jewel Magic 魔法珠宝
    NEERC2003 Jurassic Remains 侏罗纪
    UVA11895 Honorary Tickets
    gdb调试coredump(使用篇)
    使用 MegaCLI 检测磁盘状态并更换磁盘
    员工直接坦诚直来直去 真性情
    山东浪潮超越3B4000申泰RM5120-L
  • 原文地址:https://www.cnblogs.com/pandapeter/p/10441365.html
Copyright © 2011-2022 走看看