面向对象6大原则之----依赖倒置原则

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();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值