Баарыңарга салам, форумдун катышуучулары!
Мен кылдат (менимче) үлгүнү түшүндүм
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
жана конструктордо класс an objectисин кабыл алабыз . Жана алардын ар бири бир гана аракетти аткарат. Бири методду чакырат , экинчиси чакырат .
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();
}
}
Эми бул инкапсуляцияланган an object ыкмаларын кабыл алган an objectти түзүүгө убакыт келди
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