继承,多态与装饰者模式
在Java开发中,继承、多态、封装与抽象作为面向对象的四个基本特征,而装饰者模式则是属于开发的设计模式之一,在实际的代码实现当中,可以发现其实它们有很多相似的地方,将它们灵活运用在软件的开发当中,能够使项目开发效率更高且更易于维护,所以单在这里写一篇总结来探讨一下它们各自的优势与区别。
继承
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
在继承关系中,父类更通用,子类则更加具体,父类具有更加一般的特征和行为,而子类除了具有父类的特征和行为,还具有一些自己的特征和行为
![批注 2020-08-23 091733](批注 2020-08-23 091733.png)
这里我们举个例子,如上图,兔和山羊属于食草类动物,而老虎和狮子则属于食肉类动物,食草类动物和食肉类动物又都属于动物类,他们属于一层一层归属的关系,虽然都是归属于动物类,但是食草动物与食肉动物在属性和行为上是有区别的,所有子类会具有父类的一般特性同时也会具有自身的特性。
- 子类通过extends来继承父类,extends的意思是扩展,意思是子类是父类的扩展
- Java中的类只能单继承,不能多继承,(这里是和implement实现的区别),支持多重继承
- 继承是类和类之间的一种关系,除此之外,类和类之间的关系还有依赖,组合,聚合等等
- 子类和父类之间,从意义上讲应该具有“is a”的关系
接下来我们来看下具体代码的实现
1 | //动物基类 |
1 | //山羊类 |
1 | //狮子类 |
多态
多态是用一个行为具有多个不同表现形式或形态的能力,多态就是用一个接口,使用不同的实例而执行不同操作
写一个方法,它只接收父类作为参数,编写的代码也只与父类打交道,调用这个方法时,实例化不同的子类对象
- 子类重写父类的方法,是子类具有不同的方法实现
- 把父类类型作为参数类型,该弗雷及其子类作为参数转入
- 运行时,根据实际创建的对象类型形态觉得使用那个方法
我们来看下代码
1 | public class main { |
装饰者模式
装饰者模式,允许向一个现有的对象添加新的功能,同时又不改变其结构,这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类的方法签名完整性的前提下,提供了额外的功能。能够动态的给一个对象添加一些额外的职责,就增加功能来说的话,装饰者模式相比生成子类更加灵活。
这里用咖啡店来举个例子
咖啡馆为了吸引更多的顾客,需要在订单系统中允许顾客选择加入不同调料的咖啡,例如:蒸奶(Steamed Milk)、豆浆(Soy)、摩卡(Mocha,也就是巧克力风味)或覆盖奶泡。会根据所加入的调料收取不同的费用。所以订单系统必须考虑到这些调料部分。如果每种饮料搭配都单独创建一个类,那么必定会有类的数量十分庞大的情况出现,这种设计肯定是不行的
所以在这里我们引入装饰者模式
1 | //这里先定义一个饮料的抽象类 |
1 | //深焙咖啡类,一种具体的饮料 |
1 | //低咖啡因咖啡类,一种具体的饮料 |
1 | //浓缩咖啡类,一种具体的饮料 |
1 | //这里实现调料装饰者的抽象类 |
1 | //摩卡调料类(继承自CondimentDecorator) |
1 | //豆浆调料类(继承自CondimentDecorator) |
1 | //奶泡调料类(继承自CondimentDecorator) |
1 | public class MAIN { |