javaBean 关联属性,及略谈观察者模式
一:总述
概念:
注入 是指:
当有A,B两个类时,通过B的公共函数或公共变量,让B的实例保存A的实例的过程。当然了,B类中,必须有 A的相关变量,否则无从存储。
例:
class A {}
class B{
private A a;
public void setA(A a){
this.a=a;
}
}
当使用中出现“A aaa=new A(); B bbb=new B(); bbb.setA(aaa); ”代码时
称“向B注入了一个实列”;或称“把A实例注入到B实例中了”。
观察模式,就是实现“一处(A)变化,其他多处地方(B)跟着相应变化”的设计模式。基本思想是:让A调用B的方法。一般实现是:把A,B封装在各自类中,并引入一个新的中间类,完成管理任务,这里称之为管理者,符号表示为C。当A发生变化时,调用C的通知函数,而C又调用B的约定的接收函数,B在接收函数中完成相应变化。具体为:在使用时, C的实例注入到A中,并事前A调用C的通知函数;同时,B也向C注入,并事前C调用B的接收函数。其中 C中的B的相关变量类型,为B的基类,或B必须实现的接口。
观察模式中有两个概念-----监听者与被监听者。被监听者,就是要发生变化的一方(即上段中的A);监听者,就是被通知方(即上段中的B)。当要变化的一方发生变化时,监听者要调用B的相关方法,让B随之变化。
事件本质,可抽象成观察者模式。要让各个具体的观察者模式 通用到各种场合,最好的方式就是使用自定义事件。对于C#等,还可使用委托(delegate);对于java,可使用关联属性。
二 关联属性总的使用步骤
(1) 在被监听者中,添加PropertyChangeSupport 对象。
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
(2) 在被 监听者中,添加注册与注销函数。
public void addPropertyChangeListener (PropertyChangeListener listener) {
changes.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener (PropertyChangeListener listener) {
changes.removePropertyChangeListener (listener);
}
(3) 当被监听属性发生变化时,调用firePropertyChange方法。
changes.firePropertyChange("no", this.no, no);
(4) 在被通知方(即监听者)里,必须实现PropertyChangeListener接口
class UseCase implements PropertyChangeListener {
(5) 在被通知方里,向通知方进行注册。Std是通知方的一个实例
public UseCase(Student std){
this.std=std;
this.std.addPropertyChangeListener(this);
}
(6) 在被知方里,实现propertyChange方法。这是PropertyChangeListener接口的方法。
public void propertyChange(PropertyChangeEvent evt) {
if ( (evt.getSource().getClass().equals(Student.class)) &&
(evt.getPropertyName().equals("no")) ) {
no="由"+evt.getOldValue()+"变成"+evt.getNewValue();
}
}
注:总的运行原理:初始化时,通知方申请了 一个通用管理者(PropertyChangeSupportc的实例),并以该管理者为基础,向外提供注册与注销的函数;而被通知方,必须实现 管理者提供的完成接收通知的方法(PropertyChangeListener 口的propertyChange函数)。这样,当属性发生变化时,通知方调用管理者的firePropertyChange函数(即通知方法),而管理者调用向他注册过的被通知方的 propertyChange函数(即接收通知的方法),从而让被通知方相应发生变化。
三 完整示例:
import java.awt.Component;
import java.awt.Container;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
/**
* 测试javaBean 的关联属性。<br/>
* 关联属性,可以简单理解成 一个属性变化事件。<br/>
* 运用场合,可以是观察模式所应用场所,即一处变化,其他别处也将跟随变化.<br/>
* 本示例,展示了,Student对象的no变化时,UseCase对象的no跟着变化。
* @author cloud
*/
public class MainTest {
/**
* 内部类,一个javaBean. no为 被监控的属性,他一变化,就会通知监控他的对象相应变化。<br/>
* 这里,必须定义一个PropertyChangeSupport 对象。 当属性变化时,将使用该对象的
* firePropertyChange 方法,通知要变化的其他类实例,当然,在使用前需要完成注册。
*
*/
class Student {
/**
* 定义了一个PropertyChangeSupport对象。这是必须的。
*/
private PropertyChangeSupport changes = new PropertyChangeSupport(this);
private String no="张三";
public String getNo() {
return no;
}
/**
* 当no变化时,这里先要调用firePropertyChange ,发布通知。<br/>
* 其中第一个参数 重新定义了属性名,以便被通知方区别接收。
*/
public void setNo(String no) {
changes.firePropertyChange("no", this.no, no);
this.no = no;
}
/**
* 注册 需要通知的其他类实例
*/
public void addPropertyChangeListener (PropertyChangeListener listener) {
changes.addPropertyChangeListener(listener);
}
/**
* 注销 需要通知的其他类实例
*/
public void removePropertyChangeListener (PropertyChangeListener listener) {
changes.removePropertyChangeListener (listener);
}
}
/**
* 这是一个需要接收属性变化的类,或即是一个监听者,他要监听一个属性变化。<br/>
* 必须继承 PropertyChangeListener接口,并实现propertyChange方法。
*/
class UseCase implements PropertyChangeListener {
public String no="";
private Student std;
/**
* 生成实例时,必须注入一个被监听的类实例
*/
public UseCase(Student std){
this.std=std;
/**
* 向被监听者 进行注册,表示自已需要监察其属生变化
*/
this.std.addPropertyChangeListener(this);
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
/**
* 有可能 该监听者,有众多不同的需要监听的类实例,所以有第一个判断。<br/>
* 又有可能 同一个类需要监听的属性有多个,所以有第二个判断。<br/>
* 当然在被监听者中,在发布通知时,进行编码,可以达到去除第一个判断的作用。
*/
if ( (evt.getSource().getClass().equals(Student.class)) &&
(evt.getPropertyName().equals("no")) ) {
no="由"+evt.getOldValue()+"变成"+evt.getNewValue();
}
}
}
/**
* 测试方法
*/
public void run(){
Student sdt=new Student();
UseCase u=new UseCase(sdt);
System.out.println("========显示初值===============");
System.out.println("sdt.no:"+sdt.no+" ;u.no:"+u.no);
System.out.println("========属性改变,并显示========");
sdt.setNo("李四");
System.out.println("sdt.no:"+sdt.no+" ;u.no:"+u.no);
}
public static void main(String args[]) {
MainTest ma=new MainTest();
ma.run();
}
}
运行结果:
引用
========显示初值===============
sdt.no:张三 ;u.no:
========属性改变,并显示========
sdt.no:李四 ;u.no:由张三变成李四
分享到:
相关推荐
设计模式:观察者模式java和javabean
关于javabean的属性资料,关于四种属性的分类,以及各属性的详细介绍说明,对于javabean的理解有很大的帮助
JavaBean的属性与一般Java程序中所指的属性,或者说与所有面向对象的程序设计语言中对象的属性是一个概念,在程序中的具体体现就是类中的变量。在JavaBean设计中,按照属性的不同作用又细分为四类:Simple, Index, ...
注解javaBean的优点,对应相应的数据库字段
java 基础之JavaBean属性命名规范问题.docx
JavaBean与MV开发模式,讲述JavaBean的使用方法,在此基础上,讲述了与MV的使用方法
jsp+javaBean参考代码,运用dao设计模式 博文链接:https://shangdiyefankun.iteye.com/blog/129545
Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统 Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统 Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统
一、实验目的 1.熟悉JavaBean的开发过程。 2.掌握Servlet的开发过程。 二、实验学时 2H 三、实验性质 综合性实验
(基于MVC模式下web端的开发,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP+JavaBean模式程序各个模块之间层次清晰) 仅供初学者参考,内有文档注释,部分细节不懂者,留言即可
Jsp+Servlet+JavaBean 实现MVC模式的留言本 声明:本留言本所有源代码开源,使用者可以自由修改和传播,但仅限于非商业用途。 作者:梁龙 博客:http://www.lianglong.net.cn 由于这是本人学习JAVA的第一个项目,...
前台字符串赋值给JavaBean属性自动类型转换的实现(BeanUtils,ConverterConvertUtils三个类的使用)
基于JSP+JavaBean+Servlet模式的图书管理系统项目文件
自动生成Javabean的Excel工具
JavaBean简介 什么是JavaBean? JavaBean的三个组成部分 JavaBean的基本特征 BeanInfo接口 JavaBean的开发模式 使用JavaBean开发应用程序 EJB简介
一个基于JAVABEAN的BBS系统!
JavaBean 概述 JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的...众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制发现和操作这些JavaBean 属性。
可以 将 数据库表中字段转为相应的 javaBean 对象 很方便的 生产bean
JavaBean简介及基本使用 jsp的关键就是javabean的设计
两种模式{(JSP+JavaBean)和(JSP+JavaBean+servlet)}简单实现机票预订