a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 192|回复: 3

[基础知识] JAVA基础:java设计模式之观察者模式(Observer)

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
//Subject.java   package com.youngmaster.model.Observer;& n  s. z7 Y! M. j; T- `4 t
  /**
; R, D! L, m0 c. P3 H, f% k- @  */
: y: O& C2 |2 v  /**
% F* @0 B) }& R. X6 }; W9 B  * 察者模式属于行为型模式,其意图是定义对象间的一种一对多的依赖关系,, M& ]9 I6 M6 |- }6 U# E3 M: Q$ g9 d
  * 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
6 h4 G0 B2 E+ x& }  * 在制作系统的过程中,将一个系统分割成一系列相互协作的类有一个常见的副作用:4 y8 F  I) Z% N0 }& b; G: ^
  * 需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,
7 v, V# M9 J' X3 p# B8 k  * 因为这样降低了他们的可充用性。这一个模式的关键对象是目标(Subject)和观察者(Observer)。/ E! d. s% k6 ?
  * 一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,
8 H0 ~+ n6 i) V& k9 O1 i$ y; \4 @  * 作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。这种交互也称为发布-订阅模式,& i% a; \0 U3 ~% p6 T; n% k5 @
  * 目标是通知的发布者。他发出通知时并不需要知道谁是他的观察者,可以有任意数据的观察者订阅并接收通知。
% o4 h. S4 _+ P( }$ a) O  */
9 f9 u2 E8 Y9 |: Q' Y# j( O4 g  /**. h3 F$ W$ ]7 i2 o! ~  j& F
  * subject2 @! c- Q+ _: `) @0 Y+ M: D
  *目标接口: z6 U2 N. n) R; @" f# ?
  */
$ m: D' B! k* M  K; Q! v. H  public interface Subject {0 @( K: A3 c" @3 {6 ?5 B1 n
  public void addObserver(Observer o);
) T6 @' i4 w. {- p+ R& W9 R  public void deletObserver(Observer o);
% j% @  y3 G& U% X; s9 c* t  public void notice();
. N6 W% t1 K/ @7 k! D% ]. L  }" g6 g4 w" F! @. @: ?
  //Observer.java 0 ^8 l! a# E% q  p& l
  package com.youngmaster.model.Observer;
; a7 r9 @  T4 l0 Y/ q9 f/ Y: A* M  /*** F  j3 ~* R. _* t
  */
: O4 W2 \: U8 h# ]3 E) N7 m  /**5 F- D) U/ W! g# Q
  *观察者接口' q5 U: B% |- e$ {* ^
  */4 S# @/ E$ J; y: C& V
  public interface Observer {" ?( ?7 N4 q2 r5 E% \- l6 I
  public void update();+ _# Q6 {. j) j9 p

' L4 g' o# f  z/ e3 B/ L. O; J  }
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA基础:java设计模式之观察者模式(Observer)

</p>  //Teacher.java
& U8 H: T1 c$ A9 ~% g+ U  package com.youngmaster.model.Observer;
! |) O: ?- g- I/ j8 F1 j" D  import java.util.Vector;4 W1 J, R3 g# R4 i4 g2 t
  /**
* f  v  Z! I  z  */, E' O& R6 G0 X' h! P
  /**2 j3 V. H6 g1 G) O8 f( ^4 Y
  *目标接口实现
9 s( ]3 s: d7 I2 o, H  */
# T/ x6 Z3 Q2 \% A  public class Teacher implements Subject {
4 A2 o' P+ {7 h  private String phone;
3 `, ^( P. |7 `7 y* V& \% N  @SuppressWarnings("unchecked")
$ t& ]! h3 G  M* r8 x4 w: E  private Vector students;, X% f9 @! j5 P, m& i9 M$ L2 x- H8 t
  @SuppressWarnings("unchecked")
/ |% [. D. r& Q  public Teacher() {7 d3 l7 s& _4 P# o
  phone = "";- H* ]3 l5 @1 q7 J3 }2 c2 t
  students = new Vector();+ F. M2 D3 v+ x$ Y5 i7 J: `
  }: H& i4 `2 _7 Y+ t8 L) m- S) k# M
  @SuppressWarnings("unchecked")9 u; ?8 `( `* T. h
  @Override/ t' K# o2 y: w3 ?3 v" S: q
  public void addObserver(Observer o) {5 Q) H5 B* }* a! Q' i
  students.add(o);. K$ K1 ^$ s- W% S( ^$ S
  }
  J& ~$ |( r0 i  @Override
5 e. {: n4 g- _/ X  public void deletObserver(Observer o) {% @  O- I# l: l
  students.remove(o);' `9 n1 k/ \9 J$ G+ e7 Y
  }
& F# P5 @$ x) u- I# O  @Override
# D/ I3 f. Q8 z4 [' M- q7 D3 f  public void notice() {
6 L2 g' y9 Z. ^3 B  for (int i = 0; i < students.size(); i++) { ((Observer) students.get(i)).update();5 A" T% G1 O1 v. g! X% A  p, D# ^, O
  }& W5 K9 y6 E, j6 ~( _
  }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:29 | 显示全部楼层

JAVA基础:java设计模式之观察者模式(Observer)

 public void setPhone(String phone) {   this.phone = phone;
) Y! J1 U' f0 `  \0 A  notice();
7 f+ L3 `. G4 T  ^: j3 U  }- `1 _4 {9 S9 y
  public String getPhone() {
1 P, N* o5 z( U  return phone;8 C" g/ T+ ]. u( ^
  }
4 z  c, a6 D0 h( x4 h  }
; i7 U) i- T& a: N& q" K  //Student.java
7 E; W1 I8 x4 {+ r8 d) @) D* j( b  package com.youngmaster.model.Observer;" r3 a2 M% [" h( X% `8 L, @: c
  /**
! [! Z* `; R% V; w* z  */* r( A# s4 w# W' a1 T
  /**/ ?5 R$ E3 m0 ~- Y$ @* z
  *观察者接口实现
1 t5 N. Y/ t8 t9 [" }* @# Z, D6 F, H* E  */
1 R0 `) e' P* ]$ l; v5 W2 E5 q  public class Student implements Observer {5 D, P$ F# c* R& Q* h6 L( k. c
  private String name;
4 Q+ V: P  _; C' J  private String phone;* j# M) w* l4 g8 W
  private Teacher teacher;
. q& x% j; x- @; _# H5 ~  ^0 I  public Student(String name, Teacher teacher) { this.name = name; this.teacher = teacher;3 U! O0 @6 T* o9 l3 H" _3 `: ~
  }) M' ?3 F2 E1 g. A" F% r
  public void show() {
- p" g0 Y3 C& X6 X  System.out.println("Name:" + name + "\nTeacher's phone:" + phone);1 U* z  M. T: f3 H, i
  }' r: Z; Q2 \) Z& E* S' D) y, N0 F+ u
  @Override
2 p1 v; h2 p9 S; P% ~+ G  public void update() {  r, Q6 _. X# v7 a
  phone = teacher.getPhone();* K' i- \5 b) P8 S6 X7 {
  }# W7 U8 ]) P' u4 x
4 E. X. F0 H: w( s# h
  }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:30 | 显示全部楼层

JAVA基础:java设计模式之观察者模式(Observer)

</p>  //Client.java
- m4 L. S1 I3 d/ Z8 n7 B' @1 V  package com.youngmaster.model.Observer;
9 m5 W% d3 u8 {+ z+ _* z/ m  import java.util.Vector;
, x, C( G  C; i+ ?  /**
7 t) r, M6 b9 ^# p* R  *测试类3 s/ Y* G9 s; _7 K! [9 p
  */
- f3 a. s, k; a: o' Q7 ?2 J( ~* B  public class Client {
6 H) Q6 p% n, P  /**% i# O( d* \% y, I+ i; ^1 @$ _
  * @param args
$ n3 @! j. }# b2 |! s  */# q1 Y8 A+ N" D
  @SuppressWarnings("unchecked"), D8 I* l! q& J6 J3 v- P
  public static void main(String[] args) {
0 ^' ?7 V1 }0 [0 }$ F5 j* }9 N  Vector students = new Vector();
3 T) x& k4 U3 w2 k+ M  Teacher teacher = new Teacher();) W- q7 [* N( d6 Z4 @6 b. h
  for (int i = 0; i < 10; i++) {
1 M! @+ S; k9 u8 P/ D! e6 y  Student student = new Student("student-" + i, teacher); students.add(student); teacher.addObserver(student);5 S" X, N' @! F( S
  }3 o: ?7 N: p; g5 h9 {
  teacher.setPhone("13900000000");
8 S5 p( Z, u* _! c# q# F  r' c8 @  for (int i = 0; i < 10; i++)( m6 ?1 Y- v; N: P
  ((Student) students.get(i)).show();
% S( w. }, D) ]; |  System.out.println("\n============================\n");
3 ?+ u) Q% ^2 ?- L9 j  teacher.setPhone("13600000000");# ~0 Y5 P6 z, U! a
  for (int i = 0; i < 10; i++)6 x% E+ P! l8 G! H3 Y( O
  ((Student) students.get(i)).show();
! ^, h( ]- D) q, f  }
' Z' p2 e6 ?- l1 f# w* [( B0 S: m9 q  }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-4-29 23:16 , Processed in 0.165544 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表