设计模式: 七大原则之 依赖倒置原则

七大原则之 依赖倒置原则

  • 依赖导致原则:
			上层不能依赖于下层
    		它们都应该依赖于抽象
  • 什么是上层? 什么是下层?
    调用别方法,就是上层,被其它方法调用的, 就是下层

例如:

class A {
	public void method() {
		
	}
}
class B {
	public void test() {
		A a = new A();
		a.method();
	}
}
public class Demo {
	public static void main(String[] args) {
		A a = new A();
		B b = new B();
		a.method();
		b.test();
	}
}
  1. 这里Demo的主函数里面调用 A和B类的方法 所有 这个Demo是A,B两个的上层,A,B是下层
  2. B类又调用A类的方法, 所有相对来说,B是A类的上层, A是下层.

反例:

class Person {
    public void feed(Dog dog) {
        System.out.println("开始喂养...");
        dog.eat();
    }
}

class Dog {
    public void eat() {
        System.out.println("狗啃骨头");
    }
}
//=======================时空线=============================
//=========上面为服务端(提供服务,作者),下面为客户端(使用服务)=====

public class AppTest {

    public static void main(String[] args) {

        Person person = new Person();
        Dog dog = new Dog();

        person.feed(dog);

    }

}

这样看着没问题.但是过了一段时间,突然想要加个猫类

//客户端自己定义一个猫类
class Cat {
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

但是这是我们Person并没有它的方法,于是必须去Person重载feed的方法

class Person {
    public void feed(Dog dog) {
        System.out.println("开始喂养...");
        dog.eat();
    }
	
	//重载的定义的喂猫的方法
    public void feed(Cat cat) {
        System.out.println("开始喂养...");
        cat.eat();
    }
}

在这里插入图片描述
每次想要喂养一个新的动物,除了写对应的动物类之后,每次都得去重载Person类里面的feed方法

此时,这种代码违反了开闭原则,因为上面的代码是作者写的,我们只是调用,并且违反了依赖倒置原则,因为,每当下层变动时,上层都要跟着一起变动

我们希望的是,当下层新增一个动物时,上层应该“不知道”,上层代码应该不用改动!


正例:

//使用动物接口
interface Animal {
    void eat();
}

//人这个类调用动物接口的吃方法
class Person {
    public void feed(Animal animal) {
        System.out.println("开始喂养...");
        animal.eat();
    }
}

//狗实现动物这个接口
class Dog implements Animal{
    public void eat() {
        System.out.println("狗啃骨头");
    }
}

//这时直接就可以调用了
public class AppTest {

    public static void main(String[] args) {

        Person person = new Person();
        Dog dog = new Dog();
        person.feed(dog);
    }

}

这时我们想要加一个猫类或者虎类,只需要写完去实现动物类的接口

class Cat implements Animal{
    public void eat() {
        System.out.println("猫吃鱼");
    }
}

class Tiger implements Animal {

    @Override
    public void eat() {
        System.out.println("老虎吃鸡");
    }
}

这时我们根本不需要去修改或者重载Person里面的方法
在这里插入图片描述
这样不管以后我们需要增加多少个动物…都只需要去实现动物接口,此时上层Person无需改变,上层也不知道改变.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值