13初级 - 面向对象:多态

619 阅读2分钟

多态详解

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

1.png

  • 引申到现实生活中,现实生活中飞机飞,飞机就发动引擎飞,告诉小鸟飞,小鸟就挥动翅膀飞
  • 现实生活中根据消息不同,接受者会根据自己是谁去决定如何去响应消息
  • 静态方法没有多态
  • 接收者是动态绑定的,参数是静态绑定选择最不需要转换的类型
  • 换句话说,多态只对消息的接收方有效,多态只选择接受者的类型不选择参数的类型

多态实战:策略模式

  • 涉及到金额绝对不能用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线程池的四个公有方法,基本上面试多线程必问,这几个参数什么意思,如何灵活控制线程池的实现\

2.png

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {}
  • RejectedExecutionHandler是当线程太多如何拒绝拒绝开启线程的策略的具体实现,属于策略模式的应用,policy就是政策,策略的意思

    • 通过jdk源码有四种策略,第一种直接放弃,抛异常,第二种让用户决定让调用的人决定 ,第三种丢弃最旧线程,第四种直接丢弃当前进来的任务

3.png

  • 好处:可以独立的变化,线程池完全不需要关心四种策略,每次增加或者减少一种策略原先的代码完全不需要动,改变线程池代码也不需要改变策略的类,实现独立的变化,就是解耦,通过一个接口来通信,通过很弱的关系联系

多态实战:使用多态简化、重构代码

  • 右键Diagram查看继承图