设计模式面向对象 - 多态 ( 面向对象 3 要素 | 多态 提升 程序扩展性 | 多态示例 )
Posted 韩曙亮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式面向对象 - 多态 ( 面向对象 3 要素 | 多态 提升 程序扩展性 | 多态示例 )相关的知识,希望对你有一定的参考价值。
一、面向对象 3 要素
面向对象 3 3 3 要素 :
封装 : 解决 安全性 问题 ; 通过 private , protected , public 修饰方法 , 变量 , 以保证代码安全性 ;
继承 : 解决 代码重用 问题 ; 子类继承父类 ,
多态 : 解决 程序扩展 问题 ;
二、多态 ( 提升程序扩展性 )
多态有 3 3 3 种表现 :
① 子类 重写 父类方法 ;
② 相同方法名 不同参数 的 方法 重载 ;
③ 父类引用 指向 子类对象 ;
面向对象编程时 , 建议 面向接口 编程 ;
如果不使用多态 , 如果 添加新的类 时 , 就需要 修改业务逻辑 , 明显 违反了开闭原则 ;
面向对象中 , 多态发生的条件 :
- 子类 继承 ( 实现 ) 父类 ;
- 父类引用 指向 子类对象 ;
- 子类 重写 父类方法 ;
使用多态后 , JVM 在运行阶段 , 才知道要执行哪个类的方法 ;
三、不使用多态示例
业务场景 : 飞行器飞行 , 飞行器有 直升机 和 运输机 , 每个飞行器都有起飞和降落方法 ;
直升机类 :
public class Helicopter {
public void takeOff() {
System.out.println("直升飞机 起飞");
}
public void land() {
System.out.println("直升飞机 降落");
}
}
运输机类 :
public class TransportPlane {
public void takeOff() {
System.out.println("运输机 起飞");
}
public void land() {
System.out.println("运输机 降落");
}
}
客户端 : 分别为 直升机 Helicopter 和 运输机 TransportPlane 各自定义 1 1 1 个方法 ;
public class Client {
public static void main(String[] args) {
Client client = new Client();
client.doFly();
client.doFly2();
}
private void doFly() {
Helicopter helicopter = new Helicopter();
helicopter.takeOff();
System.out.println("飞行");
helicopter.land();
}
private void doFly2() {
TransportPlane transportPlane = new TransportPlane();
transportPlane.takeOff();
System.out.println("飞行");
transportPlane.land();
}
}
运行结果 :
上述示例中 , 如果要添加新的飞行器 , 战斗机 , 就要定义新的 客户端 Client 方法 , 修改客户端的业务逻辑 ;
这显然违背了 面向对象 7 7 7 大设计原则 中的 " 开闭原则 " ;
增加的新的战斗机类 :
public class Fighter {
public void takeOff() {
System.out.println("战斗机 起飞");
}
public void land() {
System.out.println("战斗机 降落");
}
}
客户端修改后的结果 :
public class Client {
public static void main(String[] args) {
Client client = new Client();
client.doFly();
client.doFly2();
client.doFly3();
}
private void doFly() {
Helicopter helicopter = new Helicopter();
helicopter.takeOff();
System.out.println("飞行");
helicopter.land();
}
private void doFly2() {
TransportPlane transportPlane = new TransportPlane();
transportPlane.takeOff();
System.out.println("飞行");
transportPlane.land();
}
private void doFly3() {
Fighter fighter = new Fighter();
fighter.takeOff();
System.out.println("飞行");
fighter.land();
}
}
执行结果 :
四、使用多态示例
飞行器接口 :
public interface Aircraft {
public void takeOff();
public void land();
}
直升飞机 :
public class Helicopter implements Aircraft {
@Override
public void takeOff() {
System.out.println("直升飞机 起飞");
}
@Override
public void land() {
System.out.println("直升飞机 降落");
}
}
运输机 :
public class TransportPlane implements Aircraft {
@Override
public void takeOff() {
System.out.println("运输机 起飞");
}
@Override
public void land() {
System.out.println("运输机 降落");
}
}
客户端类 :
public class Client {
public static void main(String[] args) {
Client client = new Client();
Aircraft aircraft1 = new Helicopter();
Aircraft aircraft2 = new TransportPlane();
client.doFly(aircraft1);
client.doFly(aircraft2);
}
private void doFly(Aircraft aircraft) {
aircraft.takeOff();
System.out.println("飞行");
aircraft.land();
}
}
执行结果 :
添加战斗机类 , Client 中的相关方法不用修改 ;
添加的战斗机类 :
public class Fighter implements Aircraft {
@Override
public void takeOff() {
System.out.println("战斗机 起飞");
}
@Override
public void land() {
System.out.println("战斗机 降落");
}
}
修改后的客户端类 :
public class Client {
public static void main(String[] args) {
Client client = new Client();
Aircraft aircraft1 = new Helicopter();
Aircraft aircraft2 = new TransportPlane();
Aircraft aircraft3 = new Fighter();
client.doFly(aircraft1);
client.doFly(aircraft2);
client.doFly(aircraft3);
}
private void doFly(Aircraft aircraft) {
aircraft.takeOff();
System.out.println("飞行");
aircraft.land();
}
}
执行结果 :
总结
多态作用 : 提升程序扩展性 ;
多态 3 3 3 种表现 : ① 子类 重写 父类方法 ; ② 相同方法名 不同参数 的 方法 重载 ; ③ 父类引用 指向 子类对象 ;
多态发生 3 3 3 条件 : ① 子类 继承 ( 实现 ) 父类 ; ② 父类引用 指向 子类对象 ; ③ 子类 重写 父类方法 ;
以上是关于设计模式面向对象 - 多态 ( 面向对象 3 要素 | 多态 提升 程序扩展性 | 多态示例 )的主要内容,如果未能解决你的问题,请参考以下文章