JAVA设计原则:里氏代换原则

里氏代换原则

一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类和子类对象的区别。也就是说,在软件里面,把父类替换成它的子类,程序的行为没有变化。一个软件实体如果使用的是一个子类的话,那
么它不能适用于其父类

一、里氏代换原则例子
1.1 Person
public class Person {
    public void display(){
        System.out.println("this is person");
    }
}
1.2 Man
public class Man extends Person {
    public void display(){
        System.out.println("this is man");
    }
}
1.3 MainClass

如果使用一个父类,一定适合其子类

public class MainClass {
    public static void main(String[] args){
        //如果使用一个父类,一定适合其子类
        Person person = new Person();
        display(person);
        Person man = new Man();
        display(man);
    }
    public static void display(Person person){
        person.display();
    }
}
1.4 MainClass

如果使用一个子类,不能适合其父类

public class MainClass {
    public static void main(String[] args){
        //如果使用一个父类,一定适合其子类
        Person person = new Person();
        display(person);  //报错
        Person man = new Man();
        display(man);  //报错
    }
    //修改参数为Man
    public static void display(Man man){
        man.display();
    }
}

二、问题分析:企鹅是一种鸟类吗

在这里插入图片描述

2.1 Bird
public interface Bird {
    public void fly();
}
2.2 LaoYing
public class LaoYing implements Bird {
    public void fly() {
        System.out.println("老鹰在飞");
    }
}
2.3 MaQue
public class MaQue implements Bird {
    public void fly() {
        System.out.println("麻雀在飞");
    }
}
2.4 QiE
//企鹅不能飞,但是鸟类,被强制实现了接口,飞的方法就必须实现,这时候就不符合里氏代换原则
//所以企鹅不应该实现该接口
public class QiE {

}
2.5 MainClass
public class MainClass {
    public static void main(String[] args){
        fly(new LaoYing());
        fly(new QiE());  //报错,因为企鹅是鸟类,但是不能飞,不应该实现该接口
    }
    public static void fly(Bird bird){
        bird.fly();
    }
}

三、问题分析:正方形是一种长方形吗

在这里插入图片描述

现实生活中认为,正方形是一种特殊的长方形,但该例子中,我们把长方形跟正方形看成两个独立的类,长方形里面有width、height两个属性,正方形里面有side一个属性,所以正方形不是长方形的子类,不存在里氏代换关系。

在这里插入图片描述

如果我们让正方形继承长方形,并覆盖长方形的getWidth、getHeight等方法,设置和返回的都是side

3.1 CFX
public class CFX {
    private long width;
    private long height;

    public long getWidth() {
        return width;
    }

    public void setWidth(long width) {
        this.width = width;
    }

    public long getHeight() {
        return height;
    }

    public void setHeight(long height) {
        this.height = height;
    }
}
3.2 ZFX
public class ZFX extends CFX {
    private long side;

    public long getWidth() {
        return this.getSide();
    }

    public void setWidth(long width) {
        this.setSide(width);
    }

    public long getHeight() {
        return this.getSide();
    }

    @Override
    public void setHeight(long height) {
        this.setSide(height);
    }

    public long getSide() {
        return side;
    }

    public void setSide(long side) {
        this.side = side;
    }
}
3.3 MainClass

在方法test中,打印出高和宽,编译器可以通过,正方形跟长方形都可以使用这个方法,但在resize方法中,对于正方形是死循环,这时候便不符合一定适合子类这个规则

public class MainClass {
    public static void main(String[] args){
        //编译器通过,可以使用
        CFX cfx = new CFX();
        cfx.setHeight(10);
        cfx.setWidth(20);
        test(cfx);
        resize(cfx);
        CFX zfx = new ZFX();
        zfx.setWidth(20);
        test(zfx);
        //程序一直执行
        resize(zfx);
    }
    public static void test(CFX cfx){
        System.out.println("高:"+cfx.getHeight());
        System.out.println("宽:"+cfx.getWidth());
    }
    //当长方形的宽高小于等于高的时候,宽就会递增
    //对于正方形就是死循坏
    //这时候便不符合适合子类这个规则
    public static void resize(CFX cfx){
        while(cfx.getHeight()<=cfx.getWidth()){
            cfx.setHeight(cfx.getHeight()+1);
            test(cfx);
        }
    }
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
里氏代换原则是指程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换的。在23种设计模式中,违反里氏代换原则的模式包括以下几种: 1. 模板方法模式:在模板方法中,由子类实现的抽象方法可能会改变模板方法的行为,违反了里氏代换原则。 2. 迭代器模式:在迭代器模式中,子类实现的迭代方法可能会引起迭代器的状态异常,违反了里氏代换原则。 3. 组合模式:在组合模式中,子类实现的添加、删除方法可能会引起整个组合对象的结构异常,违反了里氏代换原则。 4. 工厂方法模式:在工厂方法模式中,子类实现的产品可能会导致工厂方法的返回类型不一致,违反了里氏代换原则。 5. 抽象工厂模式:在抽象工厂模式中,子类实现的产品族可能会导致抽象工厂的返回类型不一致,违反了里氏代换原则。 6. 建造者模式:在建造者模式中,子类实现的部件可能会导致建造者的返回类型不一致,违反了里氏代换原则。 7. 策略模式:在策略模式中,子类实现的具体策略可能会改变策略模式的行为,违反了里氏代换原则。 8. 代理模式:在代理模式中,代理类可能会对被代理类的方法进行过滤或拦截,从而改变系统的行为,违反了里氏代换原则。 这些设计模式虽然违反了里氏代换原则,但是它们都为代码提供了更好的可扩展性和可维护性,具体情况需要根据实际情况进行权衡和选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值