抽象类的多态
场景描述
一位刚毕业的老师,目前只能通过骑车上班,多年后终于坐骑升级了,有了自己的小汽车,于是骑着小汽车上班。
骑自行车上班
1.自行车类
public class Bike{//自行车类
public void start(){
System.out.println("自行车-启动:握好把手,踩下脚踏板...");
}
public void stop(){
System.out.println("自行车-停止:捏刹车...");
}
}
2.教师类
public class Teacher {
public void open(Bike bike) {
bike.start();
}
public void close(Bike bike){
Bike bike.stop();
}
}
- 测试类
public class Test01 {
public static void main(String[] args) {
Teacher t = new Teacher();
Bike bike = new bike();
t.open(bike);
System.out.println("欣赏沿途的风景...");
t.close(bike);
}
}
开小车上班
如果此时我们还是这样先去写一个小汽车类,然后在教师类里重载open和close方法,那么这样是不是会觉得代码冗余呢,有些朋友会说并没有,那当我们面对更多人,以及更多的上班方式时,那你是不是要分别为他们准备一套,那样未必太麻烦了,而且还会破坏OCP原则;这时,我们就可以用多态的方式完成这样,只需要提取一个交通工具类,然后当需求增加的时候我们直接扩充这个交通工具类就可以了。
OCP原则 - 开闭原则:需求改动,尽可能少影响原有代码
* O - open :对创建类,是欢迎的
* C - close:对原有代码进行修改,是拒绝的
* p - principle:原则
- Vehicle类(交通工具)
public abstract class Vehicle {
public abstract void start();
public abstract void stop();
}
- Bike 类(自行车类)
public class Bike extends Vehicle{
@Override
public void start(){
System.out.println("自行车-启动:握好把手,踩下脚踏板...");
}
@Override
public void stop(){
System.out.println("自行车-停止:捏刹车...");
}
}
- Car类(小汽车类)
public class Car extends Vehicle{
@Override
public void start(){
System.out.println("小汽车-启动:系好安全带,一键启动,打转向灯,松手差,挂挡,踩油门");
}
@Override
public void stop(){
System.out.println("小汽车-停止:踩刹车,挂P档,拉手刹,关大灯,熄火,解开安全带");
}
}
- Teacher类(需求者类)
public class Teacher {
public void open(Vehicle v) {
v.start();
}
public void close(Vehicle v){
v.stop();
}
}
- Test类(测试类)
public class Test01 {
public static void main(String[] args) {
Teacher t1 = new Teacher();
//类的多态:子类对象指向父类引用
//类的多态:父类引用存储了子类对象的内存地址
Vehicle v = new Bike();
t1.open(v);
System.out.println("欣赏沿途的风景...");
t1.close(v);
System.out.println("...................");
Teacher t2 = new Teacher();
Vehicle vehicle = new Car();
t2.open(vehicle);
System.out.println("欣赏沿途的风景...");
t2.close(vehicle);
}
}
在我们升级后,如果需求增加时,比如有一个电动车的需求,那么我们的步骤就应该是,创建一个电动车的类去继承交通工具类,然后重写交通工具类的抽象方法。创建电动车对象指向父类引用,再交给给需求者使用便可。在这里同样是调用t.open(v);和t.close(v);这是结果就不一样的。这就是多态的结果,不同人都要上班,就一个上班的动作,而产生上班方式的结果不一样。
提示
以上只是我自己的看法,如有相同纯属意外。如有错误,也请谅解,勿喷!如有收获或疑问,欢迎点赞评论!