设计模式之---里氏替换

一.由来。1988年由由麻省理工学院的以为姓里的女士提出的。
二.解决什么实际问题呢?子类继承父类时,重写父类方法,可能会破坏整个继承体系。
来看看实例:


package com.yrz.liskovsubstitution;

public class LiskovSubstitution {
	public static void main(String[] args) {
		A a = new A();
		System.out.println("11-3=" + a.func1(11, 3));
		System.out.println("1-8=" + a.func1(1, 8));
		System.out.println("-----------------------");
		B b = new B();
		System.out.println("11-3=" + b.func1(11, 3));
		System.out.println("1-8=" + b.func1(1, 8));
		System.out.println("11+3+9=" + b.func2(11, 3));
	}
}

class A {
	public int func1(int num1, int num2) {
		return num1 - num2;
	}
}

class B extends A {
	public int func1(int a, int b) {
		return a + b;
	}

	public int func2(int a, int b) {
		return func1(a, b) + 9;
	}
}
运行结果:
11-3=8
1-8=-7
-----------------------
11-3=14
1-8=9
11+3+9=23

分析:可以看到 类B中 11-3=14,这是因为类B重写了类A的方法。

怎么解决呢?

将两个类都要使用的方法进行抽象。

public class LiskovSubstitutionImp {
	public static void main(String[] args) {
		AImp a = new AImp();
		System.out.println("11-3=" + a.func1(11, 3));
		System.out.println("1-8=" + a.func1(1, 8));

		System.out.println("-----------------------");
		BImp b = new BImp();
		// 因为B类不再继承A类,因此调用者,不会再func1是求减法
		// 调用完成的功能就会很明确
		System.out.println("11+3=" + b.func1(11, 3));// 这里本意是求出11+3
		System.out.println("1+8=" + b.func1(1, 8));// 1+8
		System.out.println("11+3+9=" + b.func2(11, 3));

		// 使用组合仍然可以使用到A类相关方法
		System.out.println("11-3=" + b.func3(11, 3));// 这里本意是求出11-3
	}
}

class Base {
	// 更抽象的基类
}

class AImp extends Base {
	public int func1(int num1, int num2) {
		return num1 - num2;
	}
}

class BImp extends Base {

	AImp aImp = new AImp();

	// 重写AImp减法
	public int func1(int a, int b) {
		return a + b;
	}

	public int func2(int a, int b) {
		return func1(a, b) + 9;
	}

	// 仍然使用AImp的func1方法
	public int func3(int a, int b) {
		return this.aImp.func1(a, b);
	}
}

运行结果:
11-3=8
1-8=-7
-----------------------
11+3=14
1+8=9
11+3+9=23
11-3=8

分析:解决方式是采用抽象出更基础的父类,使用组合的方式实现类A的方法在类B中调用。

总结:在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法
里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可
以通过聚合,组合,依赖 来解决问题。.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值