TaxReport.java
package com.company;
public class TaxReport {
private TaxCalculator calculator;
public TaxReport(TaxCalculator calculator){
this.calculator = calculator;
}
public void show(){
var tax = calculator.calculateTax();
System.out.println(tax);
}
}
把接口TaxCalculator直接写进来:
private TaxCalculator calculator;
public TaxReport(TaxCalculator calculator){
this.calculator = calculator;
}
Main.java
package com.company;
public class Main {
public static void main(String[] args) {
var calculator = new TaxCalculator2018(100_000);
var report = new TaxReport(calculator);
}
}
var calculator = new TaxCalculator2018(100_000);
var report = new TaxReport(calculator);
只有两个类,手动引入:POOR Man's dependency injection——需要Spring框架
TaxCalculator2018.java
package com.company;
public class TaxCalculator2018 implements TaxCalculator{
private double taxableIncome;
public TaxCalculator2018(double taxableIncome) {
this.taxableIncome = taxableIncome;
}
@Override
public double calculateTax(){
return taxableIncome*0.3;
}
}
2.Setter Injection (Setter注入)
可以改变类在运行时的依赖关系
TaxReport.java添加:
package com.company;
public class TaxReport {
private TaxCalculator calculator;
public TaxReport(TaxCalculator calculator){
this.calculator = calculator;
}
public void show(){
var tax = calculator.calculateTax();
System.out.println(tax);
}
public void setCalculator(TaxCalculator calculator) {
this.calculator = calculator;
}
}
添加一个TaxCalculator2019.java
package com.company;
public class TaxCalculator2019 implements TaxCalculator{
@Override
public double calculateTax() {
return 0;
}
}
Main.java
package com.company;
public class Main {
public static void main(String[] args) {
var calculator = new TaxCalculator2018(100_000);
var report = new TaxReport(calculator);
report.show();
report.setCalculator(new TaxCalculator2019());
report.show();
}
3.Method Injection方法注入
TaxReport.java
public void show(TaxCalculator calculator){
var tax = calculator.calculateTax();
System.out.println(tax);
}
Main.java
package com.company;
public class Main {
public static void main(String[] args) {
var calculator = new TaxCalculator2018(100_000);
var report = new TaxReport();
report.show(calculator);
report.show(new TaxCalculator2019());
}
}
3种依赖注入方式!
Done!



