Loading...

Интерфейстер артка чакыруу механизминде

 

Java интерфейстерин колдонуунун кеңири таралган жолдорунун бири кайра чалууну түзүү. Кайра чалуунун маңызы биз башка аракеттер менен чакырылган аракеттерди түзөбүз. Башкача айтканда, бир иш экинчи аракет менен аталат. Стандарттык мисал - баскычты чыкылдатуу. Биз баскычты басканда, биз бир иш-аракет жасайбыз, бирок бул чыкылдатууга жооп катары, башка аракеттер ишке ашырылат. Мисалы, принтердин сөлөкөтүн чыкылдатуу документти принтерде басып чыгара баштайт ж.б.у.с.

 

Төмөнкү мисалды карап көрөлү:

public class EventsApp {

 

    public static void main(String[] args) {

        

        Button button = new Button(new ButtonClickHandler());

        button.click();

        button.click();

        button.click();

    }

}

 

class ButtonClickHandler implements EventHandler{

    

    public void execute(){

        

        System.out.println("Баскыч басылды!");

    }

}

 

interface EventHandler{

    

    void execute();

}

 

class Button{

    

    EventHandler handler;

    Button(EventHandler action){

        

        this.handler=action;

    }

    public void click(){

        

        handler.execute();

    }

}

Ошентип, бул жерде бизде Button классы аныкталган, ал конструктордо EventHandler интерфейсинин объектин кабыл алат жана чыкылдатуу методунда (басууну имитациялоо) бул объекттин аткаруу ыкмасын чакырат.

 

Андан кийин, EventHandler ишке ашыруу ButtonClickHandler классы катары аныкталат. Ал эми негизги программада бул класстын объектиси Button конструкторуна берилет. Ошентип, конструктор аркылуу биз кнопканы чыкылдатуучу иштеткичти койдук. Жана button.click() ыкмасы чакырылган сайын, бул иштеткич чакырылат.

 

Натыйжада, программа консолдо төмөнкү натыйжаны көрсөтөт:

Баскыч басылды!

Баскыч басылды!

Баскыч басылды!

Бирок, эмне үчүн биз интерфейске бардык иш-аракеттерди киргизишибиз керек, аны ишке ашырышыбыз керек, эмне үчүн аны Button классында дароо оңой жазбашыбыз керек:

 class Button{

    

    public void click(){

        

        System.out.println("Баскыч басылды!");

    }

}

Чындыгында, класстык аныктама учурунда биз аткарылышы керек болгон аракеттерди так биле бербейбиз. Айрыкча, эгерде Button классы жана негизги программа классы башка пакеттерде, китепканаларда болсо жана аларды ар кандай иштеп чыгуучулар иштеп чыгышы мүмкүн. Мындан тышкары, бизде бир нече баскычтар болушу мүмкүн - Button объекттери жана ар бир объект үчүн биз өзүбүздүн аракетибизди аныкташыбыз керек. Мисалы, программанын негизги классын өзгөртөлү:

public class EventsApp {

 

    public static void main(String[] args) {

        

        Button tvButton = new Button(new EventHandler(){

              

            private boolean on = false;

            public void execute(){

                

                if(on) {

                    System.out.println("телевизор өчүк..");

                    on=false;

                }  

                else {

                    System.out.println("Телевизор жанык!");

                    on=true;

                }

            }

        });

        

        Button printButton = new Button(new EventHandler(){

              

            public void execute(){

                

                System.out.println("Принтер басып чыгара баштады...");

            }

        });

         

        tvButton.click();

        printButton.click();

        tvButton.click();

    }

}

Бул жерде бизде эки баскыч бар - бири телевизорду күйгүзүү жана өчүрүү үчүн, экинчиси принтерде басып чыгаруу үчүн. EventHandler интерфейсин ишке ашырган өзүнчө класстарды түзүүнүн ордуна, бул жерде иштеткичтер EventHandler интерфейсин ишке ашырган анонимдүү объекттер катары аныкталат. Мындан тышкары, сыналгы баскычынын иштеткичинде логикалык өзгөрмө түрүндө кошумча абал сакталат.

 

Натыйжада, консол төмөнкү натыйжаны көрсөтөт:

Телевизор жанык!

Принтер басып чыгара баштады...

телевизор өчүк..

 

Жыйынтыктап айтканда, мындай дараметин интерфейстери өзгөчө ар кандай графикалык API-ларда - AWT, Swing, JavaFX-де кеңири колдонулат, мында объекттердин окуяларды башкаруусу - графикалык интерфейстин элементтери өзгөчө актуалдуу экендигин айтуу керек.