Делегирование одного обработчика
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) Выполнить приведённые программы с потоками. Модифицировать их в соответствии указаниями преподавателя.