1. Определение
По соглашению, давайте сначала посмотрим на определение принципа инверсии зависимостей.
Абстракции не должны зависеть от деталей, а детали должны зависеть от абстракций.Другими словами, иглапрограммирование интерфейса, а не для реализации программирования.
Почему ты это сказал?
Из-за изменчивости деталей он очень нестабилен. Много раз изменения в требованиях приводили к изменениям в деталях.
Абстракция относительно стабильна, абстракция предназначена для извлечения общих и существенных черт из многих вещей, и ее относительно трудно изменить.
Следовательно, мы должны программировать абстрактно, а не детали.
Абстракция в Java относится к абстрактным классам или интерфейсам; детали представляют конкретные реализации.
программирование интерфейса, является основой для написания надежного кода и основным качеством, необходимым для отличных программистов.
2. Значение
1. Модули высокого уровня не должны зависеть от модулей низкого уровня, оба должны зависеть от своих абстракций.
Будь то модуль высокого уровня или модуль низкого уровня, все они относятся к конкретной реализации и деталям, и детали не должны зависеть друг от друга.
Все они должны зависеть от абстракции.
2. Абстракция не должна зависеть от деталей
Ни то, ни другое не должно зависеть от деталей, особенно абстракции не должны зависеть от деталей.
3. Детали должны опираться на абстракции
Все должно зависеть от абстракции, детали зависят от абстракции, а абстракция зависит от абстракции.
3. Код
1. Объявить зависимые объекты в методах интерфейса
package com.fanqiekt.principle.inversion;
/**
* 厨师接口
*
* @author 懒人
*/
public interface IChef {
/**
* 做饭
*/
void cooking();
}
Повара умеют готовить.
package com.fanqiekt.principle.inversion;
/**
* 四川厨师
*
* @author 懒人
*/
public class SiChuanChef implements IChef {
@Override
public void cooking() {
System.out.println("四川厨师做饭,多放辣椒。");
}
}
Класс реализации поваров, поваров сычуаньской кухни, логика которых относится к деталям.Например, повара сычуаньской кухни имеют свои собственные кулинарные процедуры (это не может быть острым).
package com.fanqiekt.principle.inversion;
/**
* 山东厨师
*
* @author 懒人
*/
public class ShanDongChef implements IChef {
@Override
public void cooking() {
System.out.println("山东厨师做饭,用葱姜蒜。");
}
}
Еще одна категория реализации шеф-повара, повара Лу, повара кухни Лу также имеют свои собственные кулинарные процедуры (хорошо используйте лук, имбирь и чеснок).
package com.fanqiekt.principle.inversion;
public interface IWaiter {
/**
* 点餐
* @param chef 指定做饭的菜系厨师
*/
void order(IChef chef);
}
Абстрактный интерфейс официанта, официант должен заказать еду для гостей.
Метод order(IChef chef) должен объявить зависимый объект в методе интерфейса.
Определите метод в интерфейсе и передайте зависимый абстрактный объект в качестве параметра.
package com.fanqiekt.principle.inversion;
/**
* 接口方法中声明依赖对象
*
* @author 懒人
*/
public class Waiter implements IWaiter{
@Override
public void order(IChef chef){
if(chef!=null) {
chef.cooking();
}
}
}
Класс реализации официанта, заказывающий, чтобы входящий шеф-повар готовил.
IChef sichuanChef = new SiChuanChef();
IChef shandongChef = new ShanDongChef();
IWaiter waiter = new Waiter();
waiter.order(sichuanChef);
waiter.order(shandongChef);
Передайте абстрактный объект в качестве параметра метода заказа.
四川厨师做饭
山东厨师做饭
результат операции.
При каждом вызове метода передается зависимый объект.
Преимущество заключается в гибкости, вы можете каждый раз передавать другой объект зависимости.
Недостатком является громоздкость и необходимость каждый раз передавать зависимый объект.
2. Конструктор передает зависимый объект
package com.fanqiekt.principle.inversion;
public interface IWaiter {
/**
* 点餐
*/
void cooking();
}
Модификация интерфейса официанта: у метода приготовления убраны параметры.
package com.fanqiekt.principle.inversion;
/**
* 构造方法传递依赖对象
*
* @author 懒人
*/
public class Waiter implements IWaiter {
private IChef chef;
/**
* 构造方法中传入依赖的抽象对象
* @param chef 厨师抽象接口
*/
public Waiter(IChef chef){
this.chef = chef;
}
@Override
public void cooking(){
if(chef!=null) {
chef.cooking();
}
}
}
Передайте абстрактный объект зависимости через конструктор.
Waiter waiter1 = new Waiter(sichuanChef);
waiter1.cooking();
Waiter waiter2 = new Waiter(shandongChef);
waiter2.cooking();
Запустите его и посмотрите результат.
四川厨师做饭
山东厨师做饭
Определение зависимостей при первом создании является как преимуществом, так и недостатком.
Преимущество в том, что он избегает модификации.
Минус в том, что для замены зависимостей нужно пересоздавать объект.
3. Метод установки для передачи зависимых объектов
package com.fanqiekt.principle.inversion;
/**
* Setter方法传递依赖对象
*
* @author 懒人
*/
public class Waiter implements IWaiter {
private IChef chef;
public void setChef(IChef chef){
this.chef = chef;
}
@Override
public void cooking(){
if(chef!=null) {
chef.cooking();
}
}
}
Зависимые объекты назначаются методом set.
Waiter plan = new Waiter();
plan.setChef(sichuanChef);
plan.cooking();
plan.setChef(shandongChef);
plan.cooking();
Запустите его и посмотрите результат.
四川厨师做饭
山东厨师做饭
Сеттеры могут не только заменять зависимые объекты, но и не должны передавать зависимые объекты каждый раз при вызове метода.
3. Преимущества
Подытожим несколько преимуществ принципа инверсии зависимостей.
уменьшить рискОпора на абстракцию значительно повышает надежность кода и естественным образом снижает риск.
Простота обслуживания и расширенияReliance abstract, будет иметь структуру, основанную на структуре, расширение будет более удобным и простым способом их обслуживания.
Увеличить скорость разработкиКак только абстрактная структура определена, ее можно развивать параллельно, не слишком сильно вмешиваясь в прогресс других.
4. Хип-хоп говорит
Далее, пожалуйста, наслаждайтесьОригинальные песни, основанные на принципе инверсии зависимостей.
嘻哈说:依赖倒置原则
作曲:懒人
作词:懒人
Rapper:懒人
需要依赖厨师为我做顿美食
不用管他到底川系或者徽系
只依赖厨师接口做法多么美丽
不然修改起来牵扯太多的话是多么费事
set方法构造方法接口方法可以将依赖做个配置
依赖倒置原则就是这么回事
抽象不依赖细节 细节依赖抽象
高层不依赖低层 都应该依赖抽象
面向接口编程记住这点才能在代码路走的够长
易扩展易维护风险降低增加开发速度
Когда мне нечего делать и слушать музыку, знания наполняют мой разум;
Не следует недооценивать изучение новых способов ношения наушников.