首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式-里氏替换原则

设计模式-里氏替换原则

原创
作者头像
mySoul
修改于 2018-11-20 02:33:17
修改于 2018-11-20 02:33:17
5390
举报
文章被收录于专栏:mySoulmySoul

设计模式-里氏替换原则

优点

面向对象的语言继承必不可少的,有如下优点

  1. 代码共享,减少创建类的工作量
  2. 提高代码的重用性
  3. 提高代码的可扩展性
  4. 提高代码的可扩展性
  5. 提高产品代码的开放性
  6. 继承侵入性 只要继承,必须拥有父类的内容
  7. 降低代码的灵活性,子类必须拥有父类的属性和方法
  8. 增强耦合性。

提供规范

里氏替换原则,为继承定义规范。

长方形是不是正方形

正方形是一种特殊的长方形,如果将正方形设计为长方形的子类,不符合里氏替换原则

下方有三个类

类图如下

关系如上所示

代码语言:txt
AI代码解释
复制
package demo1;

public class SmartTest {
	/*
	 * 长方形的长增加超过宽
	 * 
	 * @param r
	 * */
	
	public void resize(Rectangle r) {
		while (r.getHeight() <= r.getWidth()) {
			r.setHeight(r.getHeight() + 1);
		}
	}
}
代码语言:txt
AI代码解释
复制
package demo1;
/*
 * 定义一个长方形类
 * @author ming
 * */

public class Rectangle {
	protected long width;	// 可以访问基类继承而来的,不能访问基类本身的,对同包内的可见,并且子类也可见
	protected long height;
	
	public void setWidth(long width) {
		this.width = width;
	}
	
	public long getWidth() {
		return this.width;
	}
	
	public void setHeight(long height) {
		this.height = height;
	}
	
	public long getHeight() {
		return this.height;
	}
}
代码语言:txt
AI代码解释
复制
package demo1;
/*
 * 定义一个正方形类继承自长方形类
 * 
 * @author ming
 * 
 * */
public class Square extends Rectangle{
	public void setWidth(long width, long height) {
		this.width = width;
		this.height = height;
	}
	
	public long getWidth() {
		return width;
	}
	
	public void setHeight(long height, long width) {
		this.height = height;
		this.width = width;
	}
	
	public long getHeight() {
		return height;
	}
}

在上面的三块代码中,当调用SmartTest类的resize方法的时候,如果传入的是父类,那么将会可以的,如果传入的是子类,正方形,那么将会不可以的。

即。上方的为长方形行,正方形不行。

所以上面的栗子不符合里氏替换原则。

解决方法,使用继承时,要遵守里氏替换原则,类B继承类A时,不要重写父类A的方法,也不能重载父类A的方法。

如果代码更改如下更改

让其两个都共同定义同一个父类即可

其中最上层的类为两个类的抽象类。

改进如下

代码语言:txt
AI代码解释
复制
package com.ming;

/*
 * 定义一个四边形类,只有get方法set方法
 * @author ming
 * */
public abstract class Quadrangle {
	protected abstract long getWidth();
	protected abstract long getHeight();
}
代码语言:txt
AI代码解释
复制
package com.ming;

public class Rectangle extends Quadrangle {
	private long width;
	private long height;
	
	public void setWidth(long width) {
		this.width = width;
	}
	
	public long getWidth() {
		return this.width;
	}
	
	public void setHeight(long height) {
		this.height = height;
	}
	
	public long getHeight() {
		return this.height;
	}
}
代码语言:txt
AI代码解释
复制
package com.ming;

public class Square extends Quadrangle{
	private long width;
	private long height;
	
	public void setWidth(long width) {
		this.height = width;
		this.width = width;
	}
	
	public long getWidth() {
		return this.,width;
	}
	
	public void setHeight(long height) {
		this.height = height;
		this.width = height;
	}
	
	public long getHeight() {
		return this.height;
	}
}

在上方的图中,由于两个为平级关系,所以父类的地方,换成子类也都可以。

总结

里氏替换原则;父类可以的地方,换成子类也同样可以。

为什么要符合

一个栗子

代码语言:txt
AI代码解释
复制
package com.ming2;

public class A {
	public int func1(int a, int b) {
		return a-b;
	}
}
代码语言:txt
AI代码解释
复制
package com.ming2;

public 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)+100;	// 调用func1
	}
}

在上方中,如果这样书写

代码语言:txt
AI代码解释
复制
package com.ming2;

public class Client {
	public static void main(String[] args) {
		B b = new B();
		System.out.println(b.func1(100, 50));
	}
}

就违反了里氏替换原则,即子类能使用的时候,父类也必须能使用。

www.iming.info

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设备接入EasyGBS平台后请求实时流播放,出现超时是什么原因?
EasyGBS是基于公安部推出的安防主流协议(国标GB28181协议)的视频接入、处理及分发平台,具有视频直播监控、云端录像、云存储、检索回放、智能告警、语音对讲等功能,能够涵盖所有监控领域的视频能力需求,已经在大量的项目中落地应用,如明厨亮灶、平安乡村、雪亮工程等。
TSINGSEE青犀视频
2022/06/02
4370
海康4200平台与EasyGBS级联后不能播放的排查及解决方法
国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。
TSINGSEE青犀视频
2023/03/20
5730
EasyCVR通过Ehome协议接入设备,获取RTSP流地址异常如何解决?
EasyCVR平台支持海量视频设备接入、视频汇聚与管理、转码与分发、告警上报、平台级联、智能分析等等。平台支持广泛的协议类型接入,包括国标GB28181、RTMP、RTSP/Onvif、海康SDK、大华SDK、Ehome等,并能支持对外分发多格式的视频流,如RTSP、RTMP、FLV、HLS、WebRTC等,实现全终端、全平台覆盖。
TSINGSEE青犀视频
2022/08/15
6550
EasyCVR新版本(v2.5.0)无法播放WebRTC视频,其他格式均正常播放,是什么原因?
EasyCVR平台基于云边端一体化管理,支持多协议、多类型的视频设备接入,对外可分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。在视频功能上,可提供服务器集群、视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、智能分析等服务。
TSINGSEE青犀视频
2022/08/11
3590
EasyCVR接入国标GB28181设备,视频无法播放是什么原因?
EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。
TSINGSEE青犀视频
2023/06/02
2470
EasyCVR接入RTSP流,视频无法播放的原因排查与解决
EasyCVR基于云边端协同架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理,可支持多协议接入,包括市场主流标准协议与厂家私有协议及SDK,如:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、宇视SDK等。
TSINGSEE青犀视频
2023/05/23
7040
EasyGBS如何进行内网映射两个公网?
EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。
TSINGSEE青犀视频
2023/05/19
3600
EasyCVR与EasyCVR通过国标级联视频无法播放:暂不支持TCP协议
互联网等新兴技术的发展,推动着安防行业向集成化、高清化、智能化、网格化方向升级。EasyCVR平台综合性强、视频能力丰富,平台基于云边端一体化管理,具有强大的数据接入、处理及分发能力,兼容性强、开放度高,功能可灵活拓展。在视频能力上,EasyCVR可支持视频实时监控直播、云端录像、云存储、回放与检索、智能告警、视频快照、设备/用户权限管理、平台级联等,能应用在多种场景中,如智慧工地、智慧工厂、智慧校园、智慧社区、智慧楼宇等等。
TSINGSEE青犀视频
2022/05/26
3700
EasyCVR平台出现WebRTC协议视频播放不了是什么原因?
EasyCVR部署简单、兼容性高,平台采用分布式部署,可对外提供统一的API接口,实现连接设备、连接数据、连接应用,便于第三方平台快速集成。在视频接入与输出上,平台支持设备通过国标GB28181、RTMP、RTSP/Onvif、海康SDK、大华SDK、Ehome等协议接入,对外可分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。
TSINGSEE青犀视频
2022/07/04
5310
国标GB28181安防视频平台EasyGBS显示状态正常,却无法播放该如何解决?
国标GB28181视频平台EasyGBS是基于国标GB/T28181协议的行业内安防视频流媒体能力平台,可实现的视频功能包括:实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。国标GB28181视频监控平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。
TSINGSEE青犀视频
2023/08/21
3260
通过SDK接入EasyCVR平台,设备录像文件出现播放异常的原因排查与解决
EasyCVR视频融合平台基于云边端一体化架构,部署轻快、功能灵活,平台可支持多协议、多类型设备接入,包括:国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等。平台可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等视频能力与服务。
TSINGSEE青犀视频
2023/04/26
4020
设备通过国标GB28181/Ehome接入EasyCVR,视频无法打开的原因分析及解决
EasyCVR平台支持多类型设备、多协议方式接入,包括市场主流标准协议国标GB/T28181、RTMP、RTSP/Onvif协议等,以及厂家私有协议,如海康SDK、大华SDK、海康Ehome等。平台可将接入的流媒体进行处理及分发,分发的视频格式包括RTSP、RTMP、FLV、HLS、WebRTC等。
TSINGSEE青犀视频
2022/09/01
8020
硬盘录像机通过国标GB28181协议注册到EasyCVR,为何频繁出现断流?
EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。
TSINGSEE青犀视频
2023/07/20
2610
EasyCVR平台配置公网后,Webrtc格式视频流无法播放是什么原因?
EasyCVR视频融合平台基于云边端协同架构,具有强大的数据接入、处理及分发能力。平台支持多协议接入,并能将接入的视频资源进行转码与分发,支持的视频流格式包括:RTSP、RTMP、HLS、FLV、Webrtc等格式,实现全终端、全平台覆盖。
TSINGSEE青犀视频
2023/04/26
3300
EasyCVR平台如何实现国标GB28181级联播放Ehome接入的设备录像?
EasyCVR视频融合平台基于云边端智能协同架构,具有强大的数据接入、处理及分发能力,平台支持海量视频汇聚管理、全网分发、按需调阅、鉴权播放、智能分析等视频能力与服务,可支持的协议有:主流标准协议国标GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。
TSINGSEE青犀视频
2023/07/11
2830
前端设备使用Ehome协议接入EasyCVR无法播放问题解决
EasyCVR作为TSINGSEE青犀视频开发的视频协议融合平台,除了可以接入RTSP、GB28181外,还通过HIKSDK、Ehome等私有协议完成与设备的对接和视频流的传输。EasyCVR支持将所有视频通道通过GB28181协议级联到上级国标平台上,且支持同一通道级联到多个上级平台,这一操作给很多用户的级联带来了便捷。
TSINGSEE青犀视频
2021/09/17
5410
EasyGBS新版本使用https访问,不能播放视频是什么原因?
国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格式。
TSINGSEE青犀视频
2022/08/29
3100
EasyCVR平台通道视频正常播放,但设备录像却无法播放是什么原因?
EasyCVR是集视频互联网、存储、流媒体转发、视频转码、智能分析等多功能为一体的流媒体视频服务融合平台。平台基于云边端一体化架构,兼容性高、拓展性强,可支持多类型设备、多协议方式接入,包括国标GB/T28181、RTMP、RTSP/Onvif协议,以及厂家的私有协议,如:海康Ehome协议、海康SDK、大华SDK等。在功能上,EasyCVR可支持云端录像回看以及设备录像回看。
TSINGSEE青犀视频
2022/10/21
3920
EasyCVR视频融合平台设备接入的步骤及端口配置的相关注意事项
EasyCVR视频融合平台基于云边端架构,能实现视频汇聚与集中管理、视频多端分发、多屏展示。平台可支持多协议与多类型设备接入,具体包括国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等,能对外分发RTMP、RTSP、HTTP-FLV、WS-FLV、HLS、WebRTC等。今天来给大家详细介绍下EasyCVR视频融合云平台的设备接入步骤。
TSINGSEE青犀视频
2023/05/11
9180
EasyCVR国标协议接入设备,设备在线、通道却不在线的原因是什么?
EasyCVR支持多协议、多类型设备接入,包括国标GB28181、RTMP、RTSP/Onvif、海康SDK、大华SDK、海康Ehome等,属于融合性、综合性较强的视频平台。在接入类型上,GB28181协议与海康EHOME协议均属于主动注册的设备协议,用户可在平台页面的配置中心里,根据SIP信息来配置设备。
TSINGSEE青犀视频
2022/07/13
7250
推荐阅读
设备接入EasyGBS平台后请求实时流播放,出现超时是什么原因?
4370
海康4200平台与EasyGBS级联后不能播放的排查及解决方法
5730
EasyCVR通过Ehome协议接入设备,获取RTSP流地址异常如何解决?
6550
EasyCVR新版本(v2.5.0)无法播放WebRTC视频,其他格式均正常播放,是什么原因?
3590
EasyCVR接入国标GB28181设备,视频无法播放是什么原因?
2470
EasyCVR接入RTSP流,视频无法播放的原因排查与解决
7040
EasyGBS如何进行内网映射两个公网?
3600
EasyCVR与EasyCVR通过国标级联视频无法播放:暂不支持TCP协议
3700
EasyCVR平台出现WebRTC协议视频播放不了是什么原因?
5310
国标GB28181安防视频平台EasyGBS显示状态正常,却无法播放该如何解决?
3260
通过SDK接入EasyCVR平台,设备录像文件出现播放异常的原因排查与解决
4020
设备通过国标GB28181/Ehome接入EasyCVR,视频无法打开的原因分析及解决
8020
硬盘录像机通过国标GB28181协议注册到EasyCVR,为何频繁出现断流?
2610
EasyCVR平台配置公网后,Webrtc格式视频流无法播放是什么原因?
3300
EasyCVR平台如何实现国标GB28181级联播放Ehome接入的设备录像?
2830
前端设备使用Ehome协议接入EasyCVR无法播放问题解决
5410
EasyGBS新版本使用https访问,不能播放视频是什么原因?
3100
EasyCVR平台通道视频正常播放,但设备录像却无法播放是什么原因?
3920
EasyCVR视频融合平台设备接入的步骤及端口配置的相关注意事项
9180
EasyCVR国标协议接入设备,设备在线、通道却不在线的原因是什么?
7250
相关推荐
设备接入EasyGBS平台后请求实时流播放,出现超时是什么原因?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档