An example with the addition of the interface:
class Playback { private Media current; public void play(Media media) { current.stop(); current = media; current.play(); } public void next() { Media media // ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡ Π»ΠΈΠ±ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ play(media); } public void prev() { Media media // ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡ Π»ΠΈΠ±ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ play(media); } } Example with the addition of classes of operations:
class Playback { private Media current; public Media current() { return current; } public void play(Media media) { current.stop(); current = media; current.play(); } } abstract class PlayOperation { private Playback playback; public void execute() { Media media = provide(); playback.play(media); } protected abstract Media provide(); } class NextOperation extends PlayOperation { public Media provide() { Media media // ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡ Π»ΠΈΠ±ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ return media; } } class PrevOperation extends PlayOperation { public Media provide() { Media media // ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΌΡ Π»ΠΈΠ±ΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ return media; } } class RandomOperation extends PlayOperation { private Random random; public Media provide() { Media media // ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π½Π΄ΠΎΠΌΠ½ΠΎΠΉ return media; } } An example with new classes looks more attractive, but is it worth it?