b. Trình khách Globe.
1.1 Thuộc tính ràng buộc
Hạn chế của thuộc tính bound property ở trên là các đối tượng listener chỉ phản ứng lại khi giá trị thuộc tính đã bị thay đổi. Java cung cấp một khả năng khác mạnh hơn đó là tạo các thuộc tính bị ràng buộc (contraint property), tương tự như thuộc tính bound mỗi lần thuộc tính contraint định thay đổi giá trị (chỉ dự định chứ chưa thay đổi) nó sẽ thông báo đến tất cả các đối tượng listener có quyền từ chối không cho phép thay đổi và như vậy thuộc tính vẫn phải giữ nguyên giá trị ban đầu. Ngược lại nếu đối tượng listener cho phép thì quá trình thay đổi giá trị cho thuộc tính mới diễn ra tiếp tục.
Để đăng kí đối tượng listener cho thuộc tính ràng buộc, thành phần JavaBeans phải cài đặt hai phương thức đăng kí sau:
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 103 addVetoableChangeListener (VetoableChangeListener Isn)
Public void
removeVetoableChangeListener (VetoableChangeListener Isn)
//Trường hợp chỉ áp dụng cho một thuộc tính cụ thể ta cài đặt theo mẫu sau:
Public void
Add<PropertyName>Listener (VetoableChangeListener Isn) Public void
remove<PropertyName>Listener (VetoableChangeListener Isn)
Mỗi thành phần JavaBeans khác phải tự cài đặt một đối tượng listener từ giao diện VetoableChangeListener có nhiệm vụ phản ứng lại với những thay đổi này (cho phép hay không cho phép thuộc tính thay đổi), sau đó đăng kí thành phần với JavaBeans nhở vào các phương thức trên (add dùng để đăng kí còn remove dùng để loại bỏ đối tượng listener). Phương thức cần cài đặt cho giao diện VetoableChangeListener là:
Public void VetoableChange (PropertyChangeEvent evt) throws PropertyVetoException
Nếu đối tượng listener đồng ý cho thay đổi thuộc tính nó sẽ ném ra ngoại lệ
PropertyVetoException, thành phần JavaBeans có thuộc tính contraint sẽ bắt lấy và hủy bỏ quá trình thay đổi trị cho thuộc tính.
Cũng như thuộc tính dạng bound, khi thuộc tính contraint có dự định thay đối tượng listener đã đăng kí với nó bằng phương thức fireVetoableChange của đối tượng VetoableChangeSupport từ thành phần JavaBeans như sau:
Public void fireVetoableChange (String propertyName, Object oldValue, Object newValue)
Phương thức này sẽ thông báo đến mọi đối tượng listener (bằng cách gọi phương thức VetoableChange của listener) đã đăng kí với thành phần JavaBeans,
Lưu ý: Đối tượng VetoableChangeSupport cũng tương tự như PropertyChangeSupport dùng để quản lý các đối tượng listener.
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 104 PropertyChangeSupport được dùng cho thuộc tính bound còn VetoableChangeSupport dùng cho thuộc tính contraint.
Dưới đây là cách cài đặt cho một thành phần JavaBeans B có thuộc tính size. Mỗi khi size thay đổi nó sẽ thông báo cho các thành phần khác biết thông qua đối tượng listener. Đối tượng listener này sẽ từ chối không cho thay đổi thuộc tính nếu size > 100.
Ví dụ 2-3: B.java
import java . util .*; import java . beans .*; Public class B (
//vetoAgent có nhiệm vụ quản lý tất cả các đối tượng listener đã đăng kí Protected VetoableChangeSupport vetAgent = new
VetoableChangeSupport (this); //Biến lưu giữ thuộc tính Size
Private int size = 0;
//Phương thức getter dùng lấy trị của thuộc tính size Public int getSize ( ) {
Return size; }
//Phương thức setter dùng gán trị cho thuộc tính size. Public void setsize (int newSize) {
Int oldSize = size;
//Thông báo đến tất cả các đối tượng litener là thuộc tính size sắp bị thay đổi try {
vetoAgent.fireVetoableChange (“size”,
new Integer (oldSize), new Integer (newSize)); } catch (PropertyVetoException e) {
//Đối tượng Listener không cho thay đổi thuộc tính System. Out. Printn (“Listener reject”);
Return; }
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 105 Không có sự ngăn cản nào từ phía listener,
Thuộc tính size thay đổi trị giá trị mới */
Size = newSize; }
//Phương thức này dùng để đăng kí các đối tượng listener Public void addSize Listener(
VetoableChangeListener Isn){
vetoAgent.fireVetoableChangeListener (Isn) ; }
//Phương thức này dùng loại bỏ đối tượng listener đã đăng kí Public void removeSizeListener (
VetoableChangeListener Isn){
vetoAgent. removeVetoableChangeListener (Isn); }
}
Ví dụ sau sẽ sử dụng thành phần JavaBeans B và cài đặt đối tượng listenercho thuộc tính ràng buộc.
Ví dụ 2-4: useBeanB.java
Import java.beans .*; Public class useBeanB{
Public static void main (String args [] ) { //Tạo thành phần JavaBeans
Bbean = new B ();
//Đăng kí đối tượng biết lắng nghe sự thay đổi của thuộc tính size Bean. addSizeListener (new myLitenerB ( ) ) ;
// Thay đổi thuộc tính size với những trị khác nhau Bean.setstize (10);
System.out.println (“ > size after setting”
+bean.gétize ( ) );
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 106 System.out.println (“ > size after setting”
+bean.getssize ( ) );
Bean.setstize (500);
System.out.println (“ > size after setting”
+bean.getssize ( ) );
Bean.setstize (96);
System.out.println (“ > size after setting”
+bean.getssize ( ) );
} }
//Cài đặt cho đối tượng litener
Class myLitenerB implements VetoableChangeListener { //Phương thức này sẽ nhận biết sự thay đổi của thuộc tính Public void VetoableChange (
propertyChangeEvent evt) throws propertyVetoException {
Integer newVal = (Integer) evt. getNewValue ( ); Integer oldVal = (Integer) evt. getOldValue ( ); String propName = evt. getPropertyName ( );
//Kiểm tra nếu trị của thuộc tính > 100 thì không hco thay đổi If (newVal. intValue ( ) >100) {
throw (new PropertyVetoException(
“Value greater than 100”, evt ) ); }
System.out.println (“change” + propName +
“from” + oldVal.intValue ( ) +
“to” + newVal.intValue ( ) ); }
}
Kết quả khi chạy chương trình này là:
C:\ Learing>java useBeanB Change size from 0 to10
Bài giảng COP – Chuyên ngành: CNPM - Version 1
Biên soạn: Ngô Thị Lan & Nguyễn Lan Oanh - 107 >size after setting 10
change size from 130 to10
Java.beans.propertyVetoException: Value greater than 100 >size after setting 10
Change size from 500 to 10
Java.beans. propertyVetoException: Value greater than 100 >size after setting 10
Change size from 10 to 96 >size after setting 96
I. TÌM HIỂU CÁCH INTROSPRCTOR LÀM VIỆC