Барлығына сәлем, форум мүшелері!
Мен үлгіні мұқият түсіндім (менің ойымша)
Command
және бұл туралы «өз сөзіммен» айтқым келеді.
Википедияға сүйене отырып, оның мақсаты жіберуші және қабылдаушы класс бір-біріне тікелей тәуелді болмайтын құрылымды құру екенін білуге болады .
Жіберуші сыныбын қамтитын сыныпқа кері қоңырауды ұйымдастыру . Негізінде ол анық және дұрыс жазылған, бірақ бұл теорияда. Мұны қалай жасауға болады? Мәселелер осы жерден басталады, өйткені... сипаттама енді соншалықты анық және айқын емес. Сондықтан мен оны түсіндім, мен оны қалай түсінгенімді айтуды шештім, мүмкін бұл біреуге пайдалы болар: Осы үлгінің мақсатының сипаттамасына сүйене отырып, мен оны түсінікті ету үшін сипаттаманы codeпен біріктіремін, өйткені сол Википедияда олар оны көптеген тілдер үшін жалпылады, сондықтан сипаттама мысалдан бөлінген. Бұл үлгіде төрт термин бар, оларды әзірше кәдімгідей алайық: пәрмендер(
command
), пәрмен қабылдағыш(
receiver
), команда шақырушы(
invoker
) және клиент(
client
). Мен сол Википедиядан мысал аламын, бұл өте төзімді.
Тапсырма екі нәрсені орындай алатын сынып
Light
: шамды қосу және оны өшіру. Үлгі бойынша ол «командалық қабылдаушы (
receiver
)» болады.
public class Light{
public Light(){ }
public void turnOn(){
System.out.println("The light is on");
}
public void turnOff(){
System.out.println("The light is off");
}
}
execute()
Орындалатын және «команда (
command
)» үлгісі бойынша шақырылатын бір әдіспен интерфейсті құрайық.
public interface Command{
void execute();
}
Сыныптық дағдыларды орындауды инкапсуляциялау қажет
Light
. Ол үшін интерфейсті жүзеге асыратын
TurnOnLightCommand
және конструкторда сынып нысанын қабылдайтын сыныптарды жасаймыз . Және олардың әрқайсысы бір ғана әрекетті орындайды. Біреуі әдісті шақырады , ал екіншісі шақырады .
TurnOffLightCommand
Command
Light
turnOn()
turnOff()
public class TurnOnLightCommand implements Command{
private Light theLight;
public TurnOnLightCommand(Light light){
this.theLight=light;
}
public void execute(){
theLight.turnOn();
}
}
public class TurnOffLightCommand implements Command{
private Light theLight;
public TurnOffLightCommand(Light light){
this.theLight=light;
}
public void execute(){
theLight.turnOff();
}
}
Енді осы инкапсуляцияланған нысан әдістерін қабылдайтын нысанды жасау уақыты келді
Light
. Үлгі бойынша ол команданы шақырушы (шақырушы) деп аталады. Оны шақырайық және ол құрылатын әдістерде қолданылатын
Switch
конструктордағы айнымалыларды қабылдасын және .
Command
flipUp()
flipDown()
public class Switch {
private Command flipUpCommand;
private Command flipDownCommand;
public Switch(Command flipUpCommand,Command flipDownCommand){
this.flipUpCommand=flipUpCommand;
this.flipDownCommand=flipDownCommand;
}
public void flipUp(){
flipUpCommand.execute();
}
public void flipDown(){
flipDownCommand.execute();
}
}
Әрине, біз оларды жалпы не болып жатқанын түсіну үшін қолданатын сынып жасаймыз. Ол негізгі әдіс деп аталады, онда барлық әрекет орындалады:
public class TestCommand{
public static void main(String[] args){
Light l=new Light();
Command switchUp=new TurnOnLightCommand(l);
Command switchDown=new TurnOffLightCommand(l);
Switch s=new Switch(switchUp,switchDown);
s.flipUp();
s.flipDown();
}
}
Шығару келесідей болады:
"The light is on"
"The light is off"
Бұл қайда қолданылады?
Мақсаты анық, бұл не және не үшін қажет, атап айтқанда: белгілі бір орындауды бөлу қажет болған жағдайда, бұл өте ыңғайлы. Кейбір функцияларды пайдалану нақты іске асыруға байланысты емес және оны жүйеге зақым келтірместен өзгертуге болады. осындай бірдеңе...) Пікірлеріңізді жазыңыз, талқылайық, мүмкін бірдеңені жеңілдетуге және жақсырақ айтуға болады, қажет болса бәрін өңдейміз) Бірінші рет оқитындарға мүмкіндігінше түсінікті болуы үшін. Ал, мақала кімге ұнаса, оған «+» қояды :) Бұл мен үшін маңызды) Уақыт өте келе мен туралы көбірек жазғым келеді
Builder
,
Singleton
және басқалар.
Менің басқа мақалаларымды да қараңыз:
GO TO FULL VERSION