DemoDip.java 不用依赖倒置会出问题
package com.csdn.principle.dip;
class Rice{
public void heap(){
System.out.println("正在对米饭进行加热");
}
}
class Pot{
/**
* 高压锅烹饪米饭
* 如果高压锅还想多提供点功能,想炒菜,煲汤,设置肯定不一样。
* 那怎么办?
* 依赖倒置原则:要依赖抽象,而不是依赖细节。所以想办法把Rice抽象,抽象为food
* 抽象有两种:抽象类与接口。这里用接口实现。参考DemoDip2
* @param rice
*/
public void cook(Rice rice){
rice.heap();
}
}
public class DemoDip {
}
DemoDip2.java 用了依赖倒置更好
package com.csdn.principle.dip;
interface IFood{
public void heap();
}
class Rice2 implements IFood{
public void heap(){
System.out.println("正在对米饭进行加热");
}
}
class Vegetables implements IFood{
public void heap(){
System.out.println("正在炒菜");
}
}
class Pot2{
/**
* 依赖倒置原则:要依赖抽象,而不是依赖细节。所以想办法把Rice抽象,抽象为food
* 抽象有两种:抽象类与接口。这里用接口实现(推荐用接口实现,面向接口编程)。
* 这里还有2种变形(更好)
* 把这个方法中的参数当做此类中的一个属性
* 1.把这个属性值用构造方法传入
* 2.把这个属性值通过set方法传入
* 这里的cook方法以后可以删掉,用无参的cook方法
* @param food
*/
@Deprecated
public void cook(IFood food){
food.heap();
}
public IFood food;
//为了使demo中的代码不出错,暂时加这个方法
public Pot2(){
}
//方法一:用set方法。任选其一
public void setFood(IFood food) {
this.food = food;
}
//方法二:用构造方法。任选其一
public Pot2(IFood food){
this.food = food;
}
//参数为空,但是把这个参数当成了类属性,spring就是如此做的
public void cook(){
food.heap();
}
}
public class DemoDip2 {
public static void main(String[] args) {
Pot2 p = new Pot2();
p.setFood(new Rice2());
p.cook();
p = new Pot2(new Vegetables());
p.cook();
}
}