多态详解
- 一个方法表现出多个形态
- 实例方法(如果没有带static就是实例方法),默认是多态的\

- 引申到现实生活中,现实生活中飞机飞,飞机就发动引擎飞,告诉小鸟飞,小鸟就挥动翅膀飞
- 现实生活中根据消息不同,接受者会根据自己是谁去决定如何去响应消息
- 静态方法没有多态
- 接收者是动态绑定的,参数是静态绑定选择最不需要转换的类型
- 换句话说,多态只对消息的接收方有效,多态只选择接受者的类型不选择参数的类型
多态实战:策略模式
- 涉及到金额绝对不能用double,表示金额1块钱*100变成100分,另外一个选择bigDecimal
- 原本一长串的代码
package com.github.hcsp;
public class PriceCalculator {
public int calculate(String strategy, int price, User user) {
switch (strategy) {
case "NoDiscount":
return price;
case "95":
return (int) (price * 0.95);
case "VIP":
if (user.isVip()) {
return (int) (price * 0.95);
}
{
return price;
}
default:
throw new IllegalStateException();
}
}
}
-
策略模式就是一种策略
- PriceCalculator.java
package com.github.hcsp;
public class PriceCalculator {
public int calculate(DiscountStrategy strategy, int price, User user) {
return strategy.discount(price, user);
}
// public int calculate(String strategy, int price, User user) {
// switch (strategy) {
// case "NoDiscount":
// return price;
// case "95":
// return (int) (price * 0.95);
// case "VIP":
// if (user.isVip()) {
// return (int) (price * 0.95);
// }
// {
// return price;
// }
// default:
// throw new IllegalStateException();
// }
// }
}
- DiscountStrategy.java
package com.github.hcsp;
public class DiscountStrategy {
public int discount(int price, User user) {
throw new UnsupportedOperationException();
}
}
- NoDiscountStrategy.java
package com.github.hcsp;
public class NoDiscountStrategy extends DiscountStrategy{
@Override
public int discount(int price, User user) {
return price;
}
}
- 这样设计的好处就是把原本冗余的代码拆开,通过多态这种方法将策略和业务分离,很容易扩展
package com.github.hcsp;
public class PriceCalculator {
public static void main(String[] args) {
calculate(new NoDiscountStrategy(), 100, User.vip(""));
}
public static int calculate(DiscountStrategy strategy, int price, User user) {
return strategy.discount(price, user);
}
}
- 总结:每增加一个策略就增加一个类
JDK中的策略模式
- JDK线程池的四个公有方法,基本上面试多线程必问,这几个参数什么意思,如何灵活控制线程池的实现\

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {}
-
RejectedExecutionHandler是当线程太多如何拒绝拒绝开启线程的策略的具体实现,属于策略模式的应用,policy就是政策,策略的意思
- 通过jdk源码有四种策略,第一种直接放弃,抛异常,第二种让用户决定让调用的人决定 ,第三种丢弃最旧线程,第四种直接丢弃当前进来的任务

- 好处:可以独立的变化,线程池完全不需要关心四种策略,每次增加或者减少一种策略原先的代码完全不需要动,改变线程池代码也不需要改变策略的类,实现独立的变化,就是解耦,通过一个接口来通信,通过很弱的关系联系
多态实战:使用多态简化、重构代码
- 右键Diagram查看继承图