封装、继承、多态的理解
目录
1、封装
2、继承
3、多态
4、举例:计算机和外设
1、封装
封装是从使用者的角度,将某种复杂的事务,打包成一个整体,只对使用者提供方便使用的方式。
举例:
1> 胶囊:对于各种混合药物的封装
2> 可乐杯:饮料是被装在杯子里面的,杯子的最上面封上盖子,只留有一个孔用于插吸管,这其实就是封装
3> 计算机对于主机机箱对于主板、CPU及内存等配件的封装
分析一下对计算机主机的封装,它必然需要一个机箱把各种配件封装进去,如主板、CPU、内存、显卡、硬盘等。一方面,机箱起到保护作用,防止异物(如老鼠、昆虫等)进入内部而破坏电路;另一方面,机箱也不是完全封闭的,它一定对外预留有一些访问接口,如开机按钮、USB接口等,这样用户才能够使用计算机
封装的优点:主要是方便、快捷。零散的数据缺乏管理,难以直接使用,封装好后,使用者就不需要关心被子的内部对象和工作机制了。封装内的事物,以关键字“private”声明,可以防止外部随意访问,避免数据污染
注意:千万不要过度设计、过度封装,更不要东拉西扯、乱攀亲戚,比如把台灯、轮子、茶杯等物品封装在一起,或者在计算机主机里封装一个算盘。如果把一些不相干的对象硬生生封装在一起,就会使代码变得莫名其妙,难于维护与管理,所谓“物极必反,过犹不及”,所以封装一定要适度。
2、继承
继承使父类的属性和方法延续到子类中,避免子类重复编码。子类可以通过重写来修改继承而来的方法实现,或者通过追加达到属性与功能扩展的目的。
举例:
1> toString()方法:所有的类都继承Object,所以可以用Object中的toString()方法
2> 犬类和不同犬种的继承
不管是什么犬类品种,它们都有某些共同的特征与行为,如吠叫行为等,所以我们需要把犬类共有的基因抽离出来,并封装到一个犬类祖先中以供后代继承。子类直接继承(extends)父类被声明为“public”的方法,可以通过重写来修改继承的方法,或者通过关键字“super”调用父类的方法并追加达到功能扩展的效果。
继承的优点:减少重复代码,方便扩展
3、多态
多态是指利用继承(extends)或接口(implements)实现,使同一方法或接口在不同对象中具有不同的实现方式。比如犬类接口,在不同的犬种对象上,同一个方法(比如颜色),会有不同的表现方式。具体表现方式是父类引用指向子类对象(Dog dog = new Husky())。
举例:
1> 人可以食用食物,而人所能接受的食物对象有很多种。
多态的优点:减少重复代码,方便扩展、降低耦合度
4、举例:计算机和外设
越是老式的计算机,其集成度越高,甚至把所有配件都一体化,配件之间的耦合度极高,难以拆分,难以维护。为了解决这个问题,设计人员提出了模块化的概念。于是各种外设(人员提出了模块化的概念)都涌现出来,如果每种设备都有一种接口,将会出现接口泛滥,所以采用了使用标准化接口(USB接口)。USB提供了一种接口标准:电压5V,双工数据传输,最重要的是其物理形态上的统一规范,只要是USB标准,设备就可以进行接驳。
计算机、USB接口、几个外设的故事:
- 计算机:“我宣布,从现在开始USB接口晋升为我的秘书,我只接收它传递过来的数据,谁要找我沟通必须通过它。
- ”USB接口:“我不关心要接驳我的设备是什么,但我规定你必须实现我定义的getData()这个方法,但具体怎样实现我不管,总之我会调用你的这个方法把数据读取过来。
- ”USB键盘:“我有readData(data Data)这个方法,我已经实现好了,传过去的是用户输入的字符。
- ”USB鼠标:“我也一样,但传过去的是鼠标移动或点击数据。
- ”USB摄像头:“没错,我也实现了这个方法,只是我的数据是视频流相关的。
- ”USB接口:“不管你们是什么类型的数据,只要传过来转换成Data就行了,我接收你们的接驳请求,除了PS2鼠标。
- ”PS2鼠标:“@计算机,老大,这怎么办?你找来的这个USB接口太霸道了,我们根本无法沟通,你们不能尊重一下老人吗?
- ”计算机:“你自己想办法,要顺应时代潮流,与时俱进。”PS2鼠标:……
计算机中装了一个USB接口,这就是“封装”,而键盘、鼠标及摄像头都是USB接口的实现类,从广义上理解这就是一种“继承”,所以计算机的USB接口就能接驳各种各样的USB设备,这就是“多态”。
扩展:有一种设备叫”转换器“,它能轻松地将老旧的接口设备调制适配到新的接口,以达到兼容的目的,这就是“适配器模式”。
----- 内容参照《秒懂设计模式》