Делегирование одного обработчика

interface IntEv // Интерфейс события

{

void Handler (int a, String b);

}

 

class Source // Класс источника

{

IntEv intEv; // Ссылка на обработчик

 

public Source (IntEv intEv)

{

this.intEv= intEv;

}

 

// Выполнить делегированную функцию Handler

public void Fire (int x, String s)

{

intEv.Handler (1, "one");

}

}

 

class Receiver implements IntEv // Класс приёмника

{

// Обработчик события

public void Handler (int a, String b)

{

System.out.println ("a= " + a + " b= "+ b);

}

}

 

 

public class TestEv

{

public static void main ()

{

Receiver r= new Receiver (); // Создать приёмник

Source s= new Source (r); // Создать источник

// и подписать обработчик

// Генерировать событие

s.Fire (5,"five");

}

}

 

 

Делегирование многих обработчиков

(Реализация события со многими слушателями)

import java.util.*;

 

interface IntEv // Интерфейс события

{

void Handler (int a, String b); // Обработчик

}

 

class Source // Класс источника события

{

ArrayList aL; // Список ссылок на слушателей

 

public Source ()

{

aL= new ArrayList();

}

 

// Функция подписки слушателя

public void addListener (IntEv iE)

{

aL.add(iE);

}

 

// Функция генерирования события

public void Fire (int x, String s)

{

for(int i=0;i<aL.size(); i++)

{

IntEv iE=(IntEv) aL.get(i);

iE.Handler(x, s);

}

}

}

 

class Listener implements IntEv // Класс слушателя события

{

int n;

 

public Listener (int N) {n= N;}

 

// Обработчик события

public void Handler (int a, String b)

{

System.out.println ("n= " + n + " a= " + a + " b= "+ b);

}

}

 

 

public class TestEv

{

public static void main ()

{

Listener r1= new Listener (1); // Создать первый слушатель

Listener r2= new Listener (2); // Создать второй слушатель

Source s= new Source (); // Создать источник события

s.addListener(r1); // Подписать первый слушатель на событие

s.addListener(r2); // Подписать второй слушатель на событие

// Генерировать событие

s.Fire (5,"five");

}

}

 

 

Интерфейс и класс нашего события, суперкласс классов источников нашего события, классы источника и приёмника нашего события

 

 

import java.util.*;

 

class OurEvent // Класс (данных)нашего события

{

private int x;

private String s;

 

public OurEvent (int X, String S)

{x= X; s= S;}

 

public int getX() {return x;}

public String getS() {return s;}

}

 

interface OurListener // Интерфейс нашего события

{

void Handler (Object sender, OurEvent oE);

}

 

class OurSouceEvent // Суперкласс класса источника нашего события

{

ArrayList aL= new ArrayList ();// Создать список ссылок слушателей

// Добавить слушателя

public void addOurListener (OurListener oL)

{

aL.add (oL);// Добавить ссылку на слушателя нашего события

}

// Удалить слушателя

public void removeOurListener(OurListener oL)

{

aL.remove (oL);// Удалить ссылку на слушателя нашего события

}

// Сгенерировать событие

public void fireOurEvent (int a, String b)

{

OurEvent oE= new OurEvent (a, b);

for (int i= 0; i<aL.size(); i++)

{

OurListener oL= (OurListener) aL.get(i);

oL.Handler (this, oE);

}

}

}

class Source1 extends OurSouceEvent // Класс первого источника события

{

}

 

class Source2 extends OurSouceEvent // Класс второго источника события

{

// Переопределить функцию fireOurEvent

public void fireOurEvent (int a, String b)

{super.fireOurEvent (a+10,b+" plus ten");}

}

 

class Receiver implements OurListener // Класс приёмника события

{

// Обработчик события

public void Handler (Object sender, OurEvent oE)

{

System.out.print ("source= " + sender.GetType());

System.out.println (" a= " + oE.getX() + " b= "+ oE.getS());

}

}

 

public class TestEv

{

public static void main ()

{

Receiver r= new Receiver (); // Создать первый приёмник события

Source1 s1= new Source1 (); // Создать источник события

// и подписать обработчик на событие

s1.addOurListener (r);

// Генерировать событие

s1.fireOurEvent (5,"five");

/////

Source2 s2= new Source2 (); // Создать второй источник события

// и подписать обработчик на событие

s2.addOurListener (r);

// Генерировать событие

s2.fireOurEvent (5,"five");

}

}

 

Задание

7) Выполнить приведённые программы с событиями. Модифицировать их в соответствии указаниями преподавателя.

 

8) Создать программу с одним источником и массивом приёмников. Обработчики приёмников должны выдать на консоль дополнительно к данным события также номер объекта источника и номер объекта приёмника.

 

9) Создать программу с массивом источников и одним приёмником. Обработчик приёмника должен выдать на консоль дополнительно к данным события также номер объекта источника и номер объекта приёмника.

 

10) Создать программу с массивом источников и массивом приёмников. Обработчики приёмников должны выдать на консоль дополнительно к данным события также номер объекта источника и номер объекта приёмника.

 

11) Создать программу, состоящую из источника и цепочки приёмников-источников, обеспечивающих передачу сообщений в соответствии с алгоритмом, указанным преподавателем.

Часть 3. Потоки в языке С#

Поток

 

using System;

Using System.Threading;

 

class TestThread

{

static void Main ()

{

// Создать объект типа TestThread

TestThread tT= new TestThread ();

// Создать поток

Thread t= new Thread (new ThreadStart(tT.SumC));

t.Start(); // Запустить объект

}

 

void SumC () // Потоковая функция

{

int a= 10, b= 14, c=0;

for(int i=a;i<b; i++)

{

Console.WriteLine ("i= "+ i);

c= c+i;

Thread.Sleep (10);

}

Console.WriteLine ("c= "+ c);

}

}

 

Потоковые объекты

 

using System;

Using System.Threading;

 

class ThreadObject // Класс потокового объекта

{

int num; // Номер объекта

public ThreadObject (int N)

{

num= N;

// Создать поток с потоковой функцией SumC()

Thread t= new Thread (new ThreadStart(this.SumC));

t.Start (); // Запустить поток объекта

}

//Потоковая функция

Void SumC ()

{

int a= 10, b= 14, c=0;

for(int i=a;i<b; i++)

{

Console.WriteLine ("num= = "+ num +"i= "+ i);

c= c+i;

Thread.Sleep(10);

}

Console.WriteLine("c= "+ c);

}

}

 

class TestThread

{

static void Main ()

{

//Создать первый потоковый объект и запустить его поток

ThreadObject tO1= new ThreadObject (1);

//Создать второй потоковый объект и запустить его поток

ThreadObject tO2= new ThreadObject (2);

}

}

 

Задание

12) Выполнить приведённые программы с потоками. Модифицировать их в соответствии указаниями преподавателя.