`
yunhaifeiwu
  • 浏览: 163022 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

javaBean 关联属性,及略谈观察者模式

    博客分类:
  • java
阅读更多
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规范允许开发者创建可序列化、属性可访问的组件。这些组件可以通过属性变更事件(PropertyChangeSupport)支持观察者模式。例如,开发者可以...

    观察者模式及其在软件开发中的应用

    本文将详细介绍观察者模式的基本概念,并探讨其在VC++文档视图结构及Java Web开发中的Struts框架中的应用。 #### 二、观察者模式(Observer) **1. 观察者模式的概念** 观察者模式是一种行为型设计模式,它定义了...

    javabean属性资料

    Bound属性具有观察者模式的概念,当其值发生改变时,会触发一个`PropertyChangeEvent`。这个事件会被其他监听该属性的对象接收到,以便它们可以相应地更新自己的状态。例如,一个对话框(Dialog)可能会绑定到按钮...

    java 基础之JavaBean属性命名规范问题.docx

    ### JavaBean属性命名规范 JavaBean是一种遵循特定编码标准的Java类,主要用于封装数据或表示简单的数据载体。在JavaBean中,属性的命名规范是非常重要的,因为它直接影响到代码的可读性和可维护性,同时也会影响到...

    JavaBean的属性

    JavaBean的属性与一般Java程序中所指的属性,或者说与所有面向对象的程序设计语言中对象的属性是一个概念,在程序中的具体体现就是类中的变量。在JavaBean设计中,按照属性的不同作用又细分为四类:Simple, Index, ...

    模式一:jsp+javaBean

    【模式一:jsp+javaBean】是一种经典的Web开发模式,主要应用于Java Web应用程序。这个模式结合了JSP(JavaServer Pages)的视图层表现能力与JavaBean的业务逻辑处理,形成了一种前后端分离的架构,使得开发更加高效...

    使用注解javaBean关联数据库字段

    在Java编程中,注解(Annotation)是一种元数据,它提供了在代码中嵌入信息的方式,这些信息可以被编译器、JVM或其他...合理利用注解,可以更好地实现JavaBean与数据库字段的关联,是现代Java开发不可或缺的一部分。

    javabean概念和使用

    众所周知,属性名称符合这种模式,其他 Java 类可以通过自身机制发现和操作这些 JavaBean 属性。 JavaBean 的基本概念 JavaBean 是一种可复用的平台独立的软件组件,开发者可以在软件构造器工具中其直接进行可视化...

    JavaBean简介及基本使用

    JavaBean是Java编程语言中的一种特定类,它遵循一定的规范,用于封装数据并提供属性访问和方法调用。JavaBean的主要目标是使软件组件在Java应用程序中可重用和可组合,尤其在Web开发中,如JSP(JavaServer Pages)中...

    实验四 JavaBean及Servlet使用

    《JavaBean及Servlet使用》实验详解 实验四的目的是让学生深入理解JavaBean和Servlet的开发流程,这二者是Java Web开发中的重要组成部分。JavaBean是一种符合特定规范的Java类,通常用于封装业务逻辑和数据,而...

    JavaBean课件.rar

    - **Design Patterns**:JavaBean常常与单例模式、工厂模式等设计模式结合使用,提高代码的复用性和可维护性。 - **EJB(Enterprise JavaBeans)**:在企业级应用中,JavaBean可以扩展为EJB,提供更强大的服务,如...

    JAVABEAN

    在JavaBean中,我们通常会找到一些特性,如封装、公开属性、构造函数、getter和setter方法,以及可能的业务逻辑方法。这些特性使得JavaBean能够作为独立的、可复用的组件在不同的应用中使用。 描述中的"一个基于...

    JavaBean与MV开发模式

    JavaBean与MV开发模式,讲述JavaBean的使用方法,在此基础上,讲述了与MV的使用方法

    JavaBean及内省文档

    ### JavaBean 及 内省概述 #### 一、JavaBean 概念 JavaBean 是一种遵循特定编码规范的 Java 类,主要用于封装数据并提供访问这些数据的方法。它被广泛应用于 J2EE 开发中,作为组件化的一部分,使得代码更易于...

    JavaBean示例

    这个"JavaBean示例"旨在帮助初学者理解和使用JavaBean。JavaBean主要用于构建Java应用程序的可重用组件,特别是在JavaServer Pages (JSP) 和Enterprise JavaBeans (EJB) 中,它们作为数据容器来传递信息。 JavaBean...

    Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统

    Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统 Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统 Jsp+JavaBean+Servlet(MVC设计模式)的寝室管理系统

    javaBean简介.doc

    在MVC(Model-View-Controller)设计模式中,JavaBean 作为 Model 层,是应用程序的数据载体。在传统的Web开发中,JavaBean 作为数据层,负责存储和处理应用程序中的数据,同时提供公共方法来访问和修改这些数据。 ...

    JavaBean - Bound属性

    在JavaBean中,"Bound属性"是指那些当其值发生改变时,能够自动通知相关监听器和其他依赖组件的属性。这种特性使得JavaBean在Java应用程序和网页设计中(如JSP)特别有用,因为它简化了组件之间的交互。 在JavaBean...

    javaBean协议

    此外,它们也可能使用工厂模式来创建实例,或者使用观察者模式来实现发布-订阅通信。 6. **属性改变通知**:当JavaBean的属性值发生变化时,它可以通知其他组件。这通过实现`PropertyChangeSupport`类和使用`...

    机票预订{(JSP+JavaBean)和(JSP+JavaBean+servlet)}

    这里我们关注的是使用JSP(JavaServer Pages)结合JavaBean和Servlet实现的两种开发模式。以下是这两种模式的详细解释: 1. JSP+JavaBean模式: 这种模式中,JSP主要负责展示用户界面,JavaBean则作为业务逻辑层。...

Global site tag (gtag.js) - Google Analytics