优秀文章
说明
多态的前提必须满足继承和重写;
重写
普通手机类:
public class Phone{
private String displayer; // 显示器
private String battery; // 电池
// 手机充电
public void charge(){
battery = "100%";
System.out.println("当前电量:"+battery);
}
}
坏手机类:
// 继承手机类并重写手机的充电方法
public class BadPhone extends Phone {
// 坏手机充电
public void charge(){
System.out.println("充电失败!");
}
}
现在不同的手机对于同一个充电操作已经有了不同的体现,已经满足多态的前提;
实例
充电器类:
public class Charger {
// 接收所有手机类,并对传入手机执行充电操作
public void charge(Phone phone){
phone.charge();
}
}
使用充电器给不同手机充电:
public static void main(String[] args) {
Charger charger = new Charger();
charger.charge(new Phone()); //给普通手机充电
charger.charge(new BadPhone()); // 给坏手机充电
}
执行结果:
当前电量:100%
充电失败!
拓展
如何使坏手机恢复正常充电功能?
策略模式
在之前的设计中,手机的充电是否正常在编码阶段就已经决定,既然要动态的修改方法内部的实现,那么类的本身就不能具备固定的充电实现:
首先抽象充电方法:
public interface ICharge {
// 抽象充电方法
public void charge();
}
正常充电:
public class NormalCharge implements ICharge {
@Override
public void charge() {
System.out.println("充电成功!");
}
}
异常充电:
public class AbnormalCharge implements ICharge {
@Override
public void charge() {
System.out.println("充电失败!");
}
}
修改普通手机类:
public class Phone{
private String displayer; // 显示器
private String battery; // 电池
private ICharge charge; // 定义充电属性
// 调用充电属性所带来的充电方法
public void charge(){
charge.charge();
}
public ICharge getCharge() {
return charge;
}
public void setCharge(ICharge charge) {
this.charge = charge;
}
}
使用充电器给不同手机充电:
public static void main(String[] args) {
Charger charger = new Charger();
// 实例化手机
Phone phone = new Phone();
// 设置正常充电操作
phone.setCharge(new NormalCharge());
// 实例化手机
Phone badPhone = new Phone();
// 设置异常充电操作
badPhone.setCharge(new AbnormalCharge());
charger.charge(phone); //给正常手机充电
charger.charge(badPhone); // 给坏手机充电
}
执行结果:
充电成功!
充电失败!