Допустим вы хотите купить молоко:
дом->лестница->машина_Opel->магазин->кассир_Люба->купить_молоко();
Так как вы уважающий себя software developer который не видит смысла в законе Деметры, вы это скорее всего напишете в 10 разных местах системы.
2 недели назад вы продали свой Opel и купили BMW. Вы теперь должны в 10 разных местах поменять код на:
дом->лестница->машина_BMW->магазин->кассир_Люба->купить_молоко();
Теперь, допустим вы начали переживать об экологии и хотите ездить за молоком не на машине, а на велосипеде. Вы теперь должны в 10 разных местах поменять код на:
дом->лестница->велосипед->магазин->кассир_Люба->купить_молоко();
Через пару дней Любу уволили и на работу взяли нового кассира Клаву? Меняем в 10 разных местах код на:
дом->лестница->велосипед->магазин->кассир_Клава->купить_молоко();
Через другую пару дней в вашем доме поставили лифт и вы не хотите бегать по лестнице за молоком? Меняем в 10 разных местах код на:
дом->лифт->велосипед->магазин->кассир_Клава->купить_молоко();
Мораль: этих всех замен можно мыло бы избежать, если бы для покупки молока вы использовали абстракцию:
магазин->купить_молоко();