Компонентная модель в объектно-ориентированном программировании. Технология JavaBeans презентация

Содержание

Слайд 2

План лекции Компонентный подход JavaBeans Свойства компонентов Графические компоненты События и их обработка Персистентность Упаковка компонентов

План лекции

Компонентный подход
JavaBeans
Свойства компонентов
Графические компоненты
События и их обработка
Персистентность
Упаковка компонентов

Слайд 3

Объектный подход vs Компонентный подход Объектный подход Программа пишется как

Объектный подход vs Компонентный подход

Объектный подход Программа пишется как объектная модель реальной или

воображаемой системы, объекты и их отношения легко понятны
Компонентный подход Программа собирается из заранее созданных компонентов, которые могут быть достаточно сложны для понимания
Слайд 4

Понятие компонента Компонент – это элемент системы, представляющий определенную службу

Понятие компонента

Компонент – это элемент системы, представляющий определенную службу или сущность,

допускающий взаимодействие с другими компонентами
Особенности компонентов:
Многоразовое использование
Независимость от контекста
Кооперация с другими компонентами
Инкапсуляция
Самостоятельность как единицы программы
Компонент – объект, написанный в соответствии со спецификацией
Слайд 5

Требования к разработке компонентов Полная документация Более строгое тестирование Надежная

Требования к разработке компонентов

Полная документация
Более строгое тестирование
Надежная проверка достоверности входных данных
Возврат

полезных сообщений об ошибках
Разработка с учетом непредусмотренного использования
Слайд 6

Контейнеры и компоненты Контейнер предоставляет контекст, в котором компоненты могут

Контейнеры и компоненты

Контейнер предоставляет контекст, в котором компоненты могут существовать и действовать совместно
Контейнер тоже

может быть компонентом
Это полностью рекурсивно!
Слайд 7

Существующие компонентные модели JavaBeans Enterprise JavaBeans .Net Framework Components ActiveX

Существующие компонентные модели

JavaBeans
Enterprise JavaBeans
.Net Framework Components
ActiveX
COM
DCOM
CORBA
VLC & CLX

Слайд 8

JavaBeans Компонентная модель для языка Java Компоненты называются Beans (бины)

JavaBeans

Компонентная модель для языка Java
Компоненты называются Beans (бины)
Компонент описывается как класс,

удовлетворяющий определенным правилам
Следует различать компонент как класс компонента и компоненты как его экземпляры, использующиеся в программе
Для работы с компонентами используются специальные программные средства, позволяющие «визуально» настраивать компонент и его взаимодействие с другими компонентами (RAD-tools)
Слайд 9

Интроспекция Средства работы с бинами подвергают бины интроспекции Интроспекция –

Интроспекция

Средства работы с бинами подвергают бины интроспекции
Интроспекция – механизм, основанный на рефлексии, позволяющий

определить характеристики компонента, основываясь на информации, заключенной в именах элементов класса компонента и вспомогательных классах
Слайд 10

Компоненты JavaBeans Компонент имеет свойства, которые представляют собой характеристики компонента

Компоненты JavaBeans

Компонент имеет свойства, которые представляют собой характеристики компонента и могут

быть изменены в процессе сборки
Компонент использует события для взаимодействия с другими компонентами
Компоненты обладают свойством персистентности: могут сохранять свое состояние в долговременное хранилище и затем восстанавливать его
Методы компонентов являются обычными методами Java и могут использоваться другими компонентами
Слайд 11

Достоинства JavaBeans Компактность Переносимость Поддержка механизмов интроспекции Способность к работе

Достоинства JavaBeans

Компактность
Переносимость
Поддержка механизмов интроспекции
Способность к работе в графической среде быстрой разработки

приложений (RAD)
Слайд 12

Требования к компоненту JavaBeans Способность к инстанцированию нового экземпляра (бин

Требования к компоненту JavaBeans

Способность к инстанцированию нового экземпляра (бин – не

интерфейс, не абстрактный класс)
Наличие конструктора по умолчанию (конструктора без параметров)
Возможность сериализации
Следование соглашениям об именах и способах проектирования
Использование модели делегирования обработки событий
Слайд 13

Удивительное рядом Нет общего супер-класса для бинов API пакета java.beans

Удивительное рядом

Нет общего супер-класса для бинов
API пакета java.beans предоставляет только классы поддержки

функционирования компонентов JavaBeans
Нет никакого специализированного языка описания интерфейсов
Слайд 14

Свойства Виды свойств по способу доступа Допускающие запись Допускающие чтение

Свойства

Виды свойств по способу доступа
Допускающие запись
Допускающие чтение
Виды свойств по сложности
Простые
Индексированные
Связанные
Контролируемые

Слайд 15

Простые свойства Доступны пользователю как пара методов доступа (setter/getter) Любой

Простые свойства

Доступны пользователю как пара методов доступа (setter/getter)
Любой из этих методов

может отсутствовать, определяя таким образом доступность свойства для чтения/записи (read-only/write-only)
Соглашения именования:
Общий вид
public ТипСвойства getИмяСвойства()
public void setИмяСвойства(ТипСвойства значение)
Логические свойства
public boolean isИмяСвойства()
public void setИмяСвойства(boolean значение)
Слайд 16

Бин с простым свойством package beans; public class MyBean implements

Бин с простым свойством

package beans;
public class MyBean implements java.io.Serializable {
public

MyBean() {
}
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Слайд 17

Работа с простыми свойствами

Работа с простыми свойствами

Слайд 18

Индексированные свойства Определяют доступ к массиву свойств с возможностью доступа

Индексированные свойства

Определяют доступ к массиву свойств с возможностью доступа по номеру
Соглашения

именования:
public ТипСвойства[] getИмяСвойства()
public void setИмяСвойства (ТипСвойства[] значения)
public ТипСвойства getИмяСвойства (int индекс)
public void setИмяСвойства (int индекс, ТипСвойства значение)
Слайд 19

Бин с индексированным свойством public class MyBean implements java.io.Serializable {

Бин с индексированным свойством

public class MyBean implements java.io.Serializable {
private String[]

lines = new String[5];
public String[] getLines() {
return lines;
}
public void setLines(String[] lines) {
this.lines = lines;
}
public String getLines(int index) {
return lines[index];
}
public void setLines(int index, String line) {
this.lines[index] = line;
}
}
Слайд 20

Работа с индексированными свойствами

Работа с индексированными свойствами

Слайд 21

Связанные свойства Поддерживают механизм оповещения об изменениях значений свойств Обработчики

Связанные свойства

Поддерживают механизм оповещения об изменениях значений свойств
Обработчики реализуют интерфейс PropertyChangeListener

и принимают объекты PropertyChangeEvent, содержащие имя свойства и его старое и новое значения
Используется вспомогательный класс PropertyChangeSupport
Слайд 22

Бин со связанным свойством package beans; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport;

Бин со связанным свойством

package beans;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class MyBean implements

java.io.Serializable {
private final PropertyChangeSupport pcs =
new PropertyChangeSupport(this);
public void addPropertyChangeListener(
PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(
PropertyChangeListener listener) {
pcs.removePropertyChangeListener(listener);
}
Слайд 23

Бин со связанным свойством public void setMessage(String message) { String

Бин со связанным свойством

public void setMessage(String message) {
String old

= this.message;
this.message = message;
pcs.firePropertyChange("message", old, message);
}
public void setLines(String[] lines) {
String[] old = this.lines;
this.lines = lines;
pcs.firePropertyChange("lines", old, lines);
}
public void setLines(int index, String line) {
String old = this.lines[index];
this.lines[index] = line;
pcs.fireIndexedPropertyChange("lines", index, old, lines);
}
...
Слайд 24

Работа со связанными свойствами

Работа со связанными свойствами

Слайд 25

Контролируемые свойства Похожи на связанные свойства, но перед присвоением нового

Контролируемые свойства

Похожи на связанные свойства, но перед присвоением нового значения оно

должно быть проверено обработчиками
Любой обработчик в праве запретить изменение, в этом случае значение свойства останется прежним
Обработчики реализуют интерфейс VetoableChangeListener и принимают объекты PropertyChangeEvent, содержащие имя свойства и его старое и новое значения
Используется вспомогательный класс VetoableChangeSupport
Слайд 26

Бин с контролируемым свойством package beans; import java.beans.PropertyVetoException; import java.beans.VetoableChangeListener;

Бин с контролируемым свойством

package beans;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.beans.VetoableChangeSupport;
...
public

class MyBean implements java.io.Serializable {
private final VetoableChangeSupport vcs =
new VetoableChangeSupport(this);
public void addVetoableChangeListener(
VetoableChangeListener listener) {
vcs.addVetoableChangeListener(listener);
}
public void removeVetoableChangeListener(
VetoableChangeListener listener) {
vcs.removeVetoableChangeListener( listener );
}
Слайд 27

Бин с контролируемым свойством ... public void setMessage(String message) {

Бин с контролируемым свойством

...
public void setMessage(String message) {
String

old = this.message;
try {
vcs.fireVetoableChange("message", old, message);
this.message = message;
pcs.firePropertyChange("message", old, message);
} catch (PropertyVetoException e) {
this.message = old;
}
}
...
}
Слайд 28

Графические компоненты Если компоненты содержит средства визуализации, то его суперкласом

Графические компоненты

Если компоненты содержит средства визуализации, то его суперкласом должен быть:
java.awt.Component если

создается компонент на базе AWT
javax.swing.JComponent если создается компонент на базе Swing
Хотя и компоненты AWT, и компоненты Swing являются компонентами JavaBeans, не рекомендуется смешивать их в одном контейнере
Слайд 29

Графический бин package beans; import java.beans.*; import javax.swing.*; import java.awt.*;

Графический бин

package beans;
import java.beans.*;
import javax.swing.*;
import java.awt.*;
public class MyBean
extends JComponent

implements java.io.Serializable {
protected void paintComponent(Graphics g) {
g.setColor(getForeground());
int height = g.getFontMetrics().getHeight();
if (message != null) {
g.drawString(message, 0, height);
}
}
...
Слайд 30

Графический бин ... public void setMessage(String message) { String old

Графический бин

...
public void setMessage(String message) {
String old =

this.message;
try {
vcs.fireVetoableChange("message", old, message);
this.message = message;
pcs.firePropertyChange("message", old, message);
repaint();
} catch (PropertyVetoException e) {
this.message = old;
}
}
...
}
Слайд 31

Работа с графическим бином

Работа с графическим бином

Слайд 32

Модель делегирования обработки событий Событие – объект, описывающий изменение состояния

Модель делегирования обработки событий

Событие – объект, описывающий изменение состояния источника
Источник – объект,

генерирующий события
Слушатель – объект, получающий уведомление о событии
Источник генерирует событие и посылает его одному или нескольким слушателям
Слушатель просто ждет поступления события
Получив событие, слушатель обрабатывает его и затем возвращает управление
Слайд 33

Модель делегирования обработки событий Слушатели должны зарегистрироваться у источника –

Модель делегирования обработки событий

Слушатели должны зарегистрироваться у источника – события посылаются

только зарегистрировавшимся слушателям
Логика кода, обрабатывающего события, отделена от логики интерфейса, генерирующего события
Это реализация паттерна проектирования Observer
Слайд 34

Слушатели и источники Один источник может генерировать несколько типов событий

Слушатели и источники

Один источник может генерировать несколько типов событий
Один слушатель может

быть слушателем нескольких видов событий
Один слушатель может получать события одного вида от нескольких источников
Слушатель может быть источником для других слушателей и для самого себя
Источник может быть слушателем других источников и самого себя
Слайд 35

События JavaBeans Класс слушателя должен наследовать от базового типа слушателя

События JavaBeans

Класс слушателя должен наследовать от базового типа слушателя для вида

событий EventListenerType
Чтобы слушатель события мог быть зарегистрирован, компонент должен предоставлять метод public void addEventListenerType(EventListenerType a)
Чтобы слушатель события мог отказаться от регистрации, компонент должен предоставлять метод public void removeEventListenerType(EventListenerType a)
Если компонент позволяет регистрировать одновременно ограниченное количество обработчиков события, то метод добавления слушателя должен объявлять исключение java.util.TooManyListenersException
Работа с событиями также может вестись на уровне средства разработки
Слайд 36

Работа с событиями

Работа с событиями

Слайд 37

Работа с событиями

Работа с событиями

Слайд 38

Работа с событиями

Работа с событиями

Слайд 39

Работа с событиями

Работа с событиями

Слайд 40

Результат работы приложения

Результат работы приложения

Слайд 41

Персистентнось Способность объекта существовать во времени, переживая породивший его процесс

Персистентнось

Способность объекта существовать во времени, переживая породивший его процесс
Для JavaBeans реализуется

за счет сериализации
Все классы компонентов должны быть подготовлены к сериализации
Существуют механизмы сохранения состояния бинов в xml-формат
Слайд 42

Упаковка в Jar Класс компонента, вспомогательные классы, файлы помещаются в

Упаковка в Jar

Класс компонента, вспомогательные классы, файлы помещаются в jar-архив
В файле

манифеста при этом указывается дополнительная информация:

Name: beans/MyBean.class
Java-Bean: True

Слайд 43

Добавление библиотек в палитру

Добавление библиотек в палитру

Слайд 44

Вложенные типы Занятие 7.2

Вложенные типы

Занятие 7.2

Слайд 45

План лекции Вложенные типы Вложенные классы Вложенные интерфейсы Внутренние классы

План лекции

Вложенные типы
Вложенные классы
Вложенные интерфейсы
Внутренние классы
Особенности внутренних классов
Локальные классы
Анонимные классы

Слайд 46

Синтаксически корректный код class MyFirstClass { public static void main(String[]

Синтаксически корректный код

class MyFirstClass {
public static void main(String[] args) {

// ...
}
class MySecondClass {
private int a, b;
public MySecondClass(int a, int b) {
this.a = a;
this.b = b;
}
//...
}
}
Слайд 47

Вложенные типы Считаются частью внешнего типа, со всеми вытекающими правами

Вложенные типы

Считаются частью внешнего типа, со всеми вытекающими правами
Позволяют представить тип

в виде логически связанных структурных групп и контекстов
Простой и эффективный инструмент объединения семантики соотносимых объектов
Слайд 48

Статические вложенные классы Nested class Простейшая форма вложенного класса Может

Статические вложенные классы

Nested class
Простейшая форма вложенного класса
Может использоваться любыми классами, обладающими

соответствующими правами доступа
Классы, вложенные в интерфейсы, статичны по определению

class ClassA {
int a = 10;
protected static class ClassB {
int b = 15;
}
}
public class Test {
public static void main(String[] args) {
ClassA.ClassB t = new ClassA.ClassB();
System.out.println(t.b);
}
}

Слайд 49

Вложенные интерфейсы Всегда статичны (модификатор static по умолчанию) Доступ определяется

Вложенные интерфейсы

Всегда статичны (модификатор static по умолчанию)
Доступ определяется доступом внешнего класса

или интерфейса и модификаторами доступа

class ClassA {
public interface InterfaceB {
//...
}
//...
public InterfaceB get() {
//...
}
}
public class Test {
public static void main(String[] args) {
ClassA.InterfaceB t = (new ClassA()).get();
}
}

Слайд 50

Нестатические вложенные классы Называются внутренними (inner) классами Тип находится в

Нестатические вложенные классы

Называются внутренними (inner) классами
Тип находится в контексте объекта
Объект внутреннего

класса всегда ассоциируется с т.н. внешним объектом
Элементы внутреннего класса имеют доступ к полям и методам внешнего объекта
Это позволяет создавать семейства сильно связанных объектов
Слайд 51

Пример внутреннего класса class ClassA { private int a =

Пример внутреннего класса

class ClassA {
private int a = 10;
protected

class ClassB {
private int b = 15;
public int getA() { return a; }
public int getB() { return b; }
}
public ClassB get() { return new ClassB(); }
public void setB(int b, ClassB obj) {
obj.b = b;
}
}
public class Test {
public static void main(String[] args) {
ClassA objA = new ClassA();
ClassA.ClassB objB = objA.get();
objA.setB(20, objB);
System.out.println(objB.getA() + " " + objB.getB());
}
}
Слайд 52

И ещё один пример import java.io.*; interface Interface extends Serializable

И ещё один пример

import java.io.*;
interface Interface extends Serializable {
int getA();
}
class

ClassA implements Serializable {
private class ClassB implements Interface {
private int a;
public int getA() { return a; }
}
private ClassB[] arr = new ClassB[10];
{
for(int i = 0; i < 10; i++) {
arr[i] = new ClassB();
arr[i].a = i + 65;
}
}
public Interface getB(int index) { return arr[index]; }
}
Слайд 53

И его результат… public class Test { public static void

И его результат…

public class Test {
public static void main(String[] args)

throws Exception {
ClassA objA = new ClassA();
Interface objB = objA.getB(5);
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("test.bin"));
out.writeObject(objB);
out.close();
}
}

¬н ♣sr ♪ClassA$ClassBиeТнwјЛ☻ ☻I ☺aL ♠this$0t ◘LClassA;xp Fsr ♠ClassAhќЯѓэЄрЈ ☻ ☺[♥arrt ►[LClassA$ClassB;xpur ►[LClassA$ClassB;єВ2 ♂т|­Ў ☻ xp sq ~ Aq ~ ♣sq ~ Bq ~ ♣sq ~ Cq ~ ♣sq ~ Dq ~ ♣sq ~ Eq ~ ♣q ~ ☻sq ~ Gq ~ ♣sq ~ Hq ~ ♣sq ~ Iq ~ ♣sq ~ Jq ~ ♣

Слайд 54

Локальные классы Описываются в теле блока Экземпляры имеют доступ к

Локальные классы

Описываются в теле блока
Экземпляры имеют доступ к полям и методам

внешнего объекта
Экземпляры имеют доступ к локальным переменным, снабженным модификатором final

public class ClassA {
public Iterator iterator() {
class Iter implements Iterator {
//...
}
//...
return new Iter();
}

Слайд 55

Анонимные классы Описываются непосредственно в выражении new и служат его

Анонимные классы

Описываются непосредственно в выражении new и служат его частью
Тип, указанный

после new является базовым для объявляемого анонимного класса
Могут расширять один класс или реализовывать один интерфейс
Явно писать implements или extends нельзя
Не могут иметь конструкторов
Слайд 56

Пример анонимного класса import java.awt.*; import javax.swing.*; public class MyApplet

Пример анонимного класса

import java.awt.*;
import javax.swing.*;
public class MyApplet extends JApplet {
...

public void init() {
JButton btn = new JButton("?");
getContentPane().add(btn);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
((JButton)e.getSource()).setText("!");
}
});
}
}
Слайд 57

Спасибо за внимание!

Спасибо за внимание!

Имя файла: Компонентная-модель-в-объектно-ориентированном-программировании.-Технология-JavaBeans.pptx
Количество просмотров: 72
Количество скачиваний: 0