美文网首页
设计模式-里氏替换原则

设计模式-里氏替换原则

作者: 吃番茄的土拨鼠 | 来源:发表于2020-04-01 18:12 被阅读0次

里氏替换原则

定义:使用父类的地方都能使用子类替换

要求:
1.子类的入参类型要比父类方法入参更宽(入参类型是父类入参类型的类型或者父类型)
2.子类的返回值类型父类方法要更窄(返回值类型是父类的返回类型或者子类型)
在java中就是要求子类不要Override父类的方法,保证子类实例化对象还是能调用到父类方法


代码示例如下

 public static void main(String[] args) {
        //初始我们只想有一个能“食物”的动物
        Animal animal = new Animal();
        Food food = new Food();
        animal.eat(food);

        //我们把这个动物增强,让它能吃鱼。但是我们还是希望它作为动物本身还是可以继续吃"食物"
        Cat cat = new Cat();
        cat.eat(food);
        cat.eat(new Fish());

        //我们把这个动物增强,让它能咩咩叫。但是我们还是希望它作为动物本身还是可以继续吃"食物"
        //我们发现它已经不能继续吃“食物"了,而是开始吃草了。因为它无法调用到父类的方法了
        Sheep sheep = new Sheep();
        sheep.eat(food);
        sheep.eat(new Grass());
    }

    public static class Animal {
        protected String name;

        public void eat(Food food) {
            String subjectName = this.name == null ? "animal" : this.name;
            System.out.println(String.format("%s eat food", subjectName));
        }

        public void setName(String name) {
            this.name = name;
        }

    }

    //符合LSP
    public static class Cat extends Animal {

        public void eat(Fish fish) {
            System.out.println(String.format("%s  eat fish", this.name));
        }


        public Cat() {
            this.setName("cat");
        }
    }

    //不符合LSP
    public static class Sheep extends Animal {

        @Override
        public void eat(Food food) {
            System.out.println(String.format("%s eat grass", this.name));
        }

        public void meimie(Grass grass) {
            System.out.println(String.format("%s can miemie", this.name));
        }


        public Sheep() {
            this.setName("sheep");
        }
    }


    public static class Fish extends Food {

    }

    public static class Grass extends Food {
    }


    public static class Food {

    }

相关文章

  • 设计模式之里氏替换原则

    设计模式之里氏替换原则 里氏替换原则(LSP: Liskov Substitution Principle) 定义...

  • 里氏替换原则

    个人博客原文:里氏替换原则 设计模式六大原则之二:里氏替换原则。 简介 姓名 :里氏替换原则 英文名 :Lisko...

  • 装饰器、简单工厂、工厂方法和抽象工厂模式

    设计模式的六大原则 单一职责原则(Single Responsibility Principle) 里氏替换原则(...

  • 设计模式的设计原则

    设计模式的设计原则 面向对象五大设计原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 开闭原则 设计模...

  • 设计模式

    设计模式六大原则[设计模式六大原则(1):单一职责原则][设计模式六大原则(2):里氏替换原则][设计模式六大原则...

  • 设计模式 里氏替换原则

    设计模式 里氏替换原则继续里氏替换原则。上回栗子为正方形不能被长方形继承,这次,具体 子类必须实现父类的方法 类图...

  • Swift设计模式----目录

    面向对象设计原则: 开闭原则 单一职责原则 依赖倒置原则 接口分离原则 迪米特法则 里氏替换原则 面向对象设计模式...

  • 设计模式-六大原则

    转载自 设计模式六大原则 目录:- 设计模式六大原则(1):单一职责原则- 设计模式六大原则(2):里氏替换原则-...

  • 设计模式六大原则

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒...

  • 设计模式6大原则

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒...

网友评论

      本文标题:设计模式-里氏替换原则

      本文链接:https://www.haomeiwen.com/subject/rluauhtx.html