新聞中心
JAVA觀察者模式(observer pattern)
import?java.util.ArrayList;
成都創(chuàng)新互聯(lián)從2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目成都做網(wǎng)站、網(wǎng)站設(shè)計網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元普蘭做網(wǎng)站,已為上家服務,為普蘭各地企業(yè)和個人服務,聯(lián)系電話:18980820575
import?java.util.HashMap;
import?java.util.Random;
import?javax.swing.event.ChangeEvent;
import?javax.swing.event.ChangeListener;
public?class?StockLists?implements?Runnable
{
private?HashMapString,?Stock?????????????????????hmStocks?=?new?HashMapString,?Stock();
private?HashMapString,?ArrayListChangeListener?hmCL?????=?new?HashMapString,?ArrayListChangeListener();
public?StockLists()
{
init(100);
new?Thread(this).start();
}
public?void?run()
{
Random?rand?=?new?Random();
while?(true)
{
try
{
Thread.sleep(100);
Stock?s?=?randStock();
s.price?=?rand.nextFloat();
ArrayListChangeListener?alCL?=?hmCL.get(s.symbol);
if?(alCL?==?null)
{
continue;
}
for?(ChangeListener?cl?:?alCL)
{
cl.stateChanged(new?ChangeEvent(s));
}
}
catch?(InterruptedException?e)
{
e.printStackTrace();
}
}
}
private?Stock?randStock()
{
Random?rand?=?new?Random();
int?idx?=?rand.nextInt(hmStocks.size());
String?sym?=?(String)?hmStocks.keySet().toArray()[idx];
Stock?s?=?hmStocks.get(sym);
return?s;
}
public?boolean?addChangeListener(ChangeListener?cl,?String?sym)
{
ArrayListChangeListener?al?=?hmCL.get(sym);
if?(al?==?null)
{
al?=?new?ArrayListChangeListener();
hmCL.put(sym,?al);
}
return?al.add(cl);
}
private?void?init(int?count)
{
Random?rand?=?new?Random();
for?(int?i?=?0;?i??count;?i++)
{
String?sym?=?randSym(rand);
float?p?=?rand.nextFloat();
Stock?s?=?new?Stock(sym,?p);
hmStocks.put(sym,?s);
}
}
private?String?randSym(Random?rand)
{
char[]?ca?=?new?char[3];
for?(int?i?=?0;?i??ca.length;?i++)
{
ca[i]?=?(char)?('A'?+?rand.nextInt(26));
}
return?new?String(ca);
}
public?static?void?main(String[]?args)
{
StockLists?sl?=?new?StockLists();
sl.addChangeListener(new?Investor("111"),?sl.randStock().symbol);
sl.addChangeListener(new?Investor("222"),?sl.randStock().symbol);
sl.addChangeListener(new?Investor("333"),?sl.randStock().symbol);
sl.addChangeListener(new?Investor("444"),?sl.randStock().symbol);
sl.addChangeListener(new?Investor("555"),?sl.randStock().symbol);
sl.addChangeListener(new?Investor("666"),?sl.randStock().symbol);
sl.addChangeListener(new?Investor("777"),?sl.randStock().symbol);
sl.addChangeListener(new?Investor("888"),?sl.randStock().symbol);
sl.addChangeListener(new?Investor("999"),?sl.randStock().symbol);
sl.addChangeListener(new?Investor("000"),?sl.randStock().symbol);
}
}
class?Stock
{
public?String?symbol?=?null;
public?float??price??=?0.0f;
public?Stock(String?sym,?float?p)
{
symbol?=?sym;
price?=?p;
}
public?String?toString()
{
return?symbol?+?":"?+?price;
}
}
class?Investor?implements?ChangeListener
{
public?String?name?=?"";
public?Investor(String?name)
{
this.name?=?name;
}
@Override
public?void?stateChanged(ChangeEvent?e)
{
Stock?s?=?(Stock)?e.getSource();
System.out.println("Hello,"?+?name?+?"?:?STOCK?CHANGED:?"?+?s);
}
}
java 設(shè)計模式之 觀察者模式(Observer)
//Subject java
package youngmaster model Observer;
/**
* @author youngmaster
* @E mail:young * @version myEclipse
* @create time 上午 : :
*/
/**
* 察者模式屬于行為型模式 其意圖是定義對象間的一種一對多的依賴關(guān)系
* 當一個對象的狀態(tài)發(fā)生改變時 所有依賴于它的對象都得到通知并被自動更新
* 在制作系統(tǒng)的過程中 將一個系統(tǒng)分割成一系列相互協(xié)作的類有一個常見的副作用
* 需要維護相關(guān)對象間的一致性 我們不希望為了維持一致性而使各類緊密耦合
* 因為這樣降低了他們的可充用性 這一個模式的關(guān)鍵對象是目標(Subject)和觀察者(Observer)
* 一個目標可以有任意數(shù)目的依賴它的觀察者 一旦目標的狀態(tài)發(fā)生改變 所有的觀察者都得到通知
* 作為對這個通知的響應 每個觀察者都將查詢目標以使其狀態(tài)與目標的狀態(tài)同步 這種交互也稱為發(fā)布 訂閱模式
* 目標是通知的發(fā)布者 他發(fā)出通知時并不需要知道誰是他的觀察者 可以有任意數(shù)據(jù)的觀察者訂閱并接收通知
*/
/**
* subject
*目標接口
*/
public interface Subject {
public void addObserver(Observer o);
public void deletObserver(Observer o);
public void notice();
}
//Observer java
package youngmaster model Observer;
/**
* @author youngmaster
* @E mail:young * @version myEclipse
* @create time 上午 : :
*/
/**
*觀察者接口
*/
public interface Observer {
public void update();
}
//Teacher java
package youngmaster model Observer;
import java util Vector;
/**
* @author youngmaster
* @E mail:young * @version myEclipse
* @create time 上午 : :
*/
/**
*目標接口實現(xiàn)
*/
public class Teacher implements Subject {
private String phone;
@SuppressWarnings( unchecked )
private Vector students;
@SuppressWarnings( unchecked )
public Teacher() {
phone = ;
students = new Vector();
}
@SuppressWarnings( unchecked )
@Override
public void addObserver(Observer o) {
students add(o);
}
@Override
public void deletObserver(Observer o) {
students remove(o);
}
@Override
public void notice() {
for (int i = ; i students size(); i++) { ((Observer) students get(i)) update();
}
}
public void setPhone(String phone) {
this phone = phone;
notice();
}
public String getPhone() {
return phone;
}
}
//Student java
package youngmaster model Observer;
/**
* @author youngmaster
* @E mail:young * @version myEclipse
* @create time 上午 : :
*/
/**
*觀察者接口實現(xiàn)
*/
public class Student implements Observer {
private String name;
private String phone;
private Teacher teacher;
public Student(String name Teacher teacher) { this name = name; this teacher = teacher;
}
public void show() {
System out println( Name: + name + \nTeacher s phone: + phone);
}
@Override
public void update() {
phone = teacher getPhone();
}
}
//Client java
package youngmaster model Observer;
import java util Vector;
/**
* @author youngmaster
* @E mail:young * @version myEclipse
* @create time 上午 : :
*/
/**
*測試類
*/
public class Client {
/**
* @param args
*/
@SuppressWarnings( unchecked )
public static void main(String[] args) {
Vector students = new Vector();
Teacher teacher = new Teacher();
for (int i = ; i ; i++) {
Student student = new Student( student + i teacher); students add(student); teacher addObserver(student);
}
teacher setPhone( );
for (int i = ; i ; i++)
((Student) students get(i)) show();
System out println( \n============================\n );
teacher setPhone( );
for (int i = ; i ; i++)
((Student) students get(i)) show();
}
lishixinzhi/Article/program/Java/gj/201311/27566
Java中使用觀察者模式實現(xiàn)自定義事件
MyEventTest java:
package wintys event;
import javax swing event EventListenerList;
import java util Date;
import java text DateFormat;
import java text SimpleDateFormat;
/**
* Java的事件機制/自定義事件
運行結(jié)果:
do something interesting in source here
listener detects [event]:wintys event MyEvent[source=wintys event MySource@
] [occur at]: : :
listener detects [event]:wintys event MyEvent[source=wintys event MySource@
] [occur at]: : :
* @version
* @author 天堂露珠 ()
* @see
*/
class MyEventTest{
public static void main(String[] args){
MySource source = new MySource();
MyListener myListener = new MyListener(){
public void doMyAction(MyEvent e){
System out println( listener detects + e);
}
};
source addMyListener(myListener);
source addMyListener(myListener);
source addMyListener(myListener);
source removeMyListener(myListener);
source doSomething();
}
}
/**
* 自定義的事件
* @version
* @author 天堂露珠()
* @see
*/
class MyEvent extends java util EventObject{
private Date date;//記錄事件發(fā)生的時間
public MyEvent(Object source Date date){
super(source);
this date = date;
}
public String toString(){
DateFormat df = new SimpleDateFormat( yyyy MM dd HH:mm:ss );
String dt = df format(date);
return [event]: + super toString() + [occur at]: + dt;
}
}
/**
* 自定義事件監(jiān)聽器接口
* @version
* @author 天堂露珠()
* @see
*/
interface MyListener extends java util EventListener{
void doMyAction(MyEvent e);
}
/**
* 自定義事件源
* @version
* @author 天堂露珠()
* @see
*/
class MySource{
/**
* 保存注冊的監(jiān)聽器列表
* 子類可以使用它保存自己的事件監(jiān)聽器(非MyListener監(jiān)聽器)列表
*/
protected EventListenerList listenerList = new EventListenerList();
private MyEvent myEvent = null;//fireDoMyAction()使用此變量
/**
* 沒有做任何事
*/
public MySource(){
}
/**
* 添加一個MyListener監(jiān)聽器
*/
public void addMyListener(MyListener listener){
listenerList add(MyListener class listener);
}
/**
* 移除一個已注冊的MyListener監(jiān)聽器
* 如果監(jiān)聽器列表中已有相同的監(jiān)聽器listener listener
* 并且listener ==listener
* 那么只移除最近注冊的一個監(jiān)聽器
*/
public void removeMyListener(MyListener listener){
listenerList remove(MyListener class listener);
}
/**
* @return 在此對象上監(jiān)聽的所有MyListener類型的監(jiān)聽器
*/
public MyListener[] getMyListeners(){
return (MyListener[])listenerList getListeners(MyListener class);
}
//Winty:Copy directly from javax swing event EventListenerList
/*Notify all listeners that have registered interest for
notification on this event type The event instance
is lazily created using the parameters passed into
the fire method
*/
protected void fireDoMyAction() {
// getListenerList() Guaranteed to return a non null array
Object[] listeners = listenerList getListenerList();
// Process the listeners last to first notifying
// those that are interested in this event
for (int i = listeners length ; i= ; i = ) {
if (listeners[i]==MyListener class) {
// Lazily create the event:
if (myEvent == null)
myEvent = new MyEvent(this new Date());
((MyListener)listeners[i+ ]) doMyAction(myEvent);
}
}
}
/**
* 做一些事件源應該做的有意義的事 然后通知監(jiān)聽器
* 這里只是一個示例方法
* 例如:MySource如果是一個按鈕 則doSomething()就可以命名為click()
* 當用戶點擊按鈕時調(diào)用click()方法
*/
public void doSomething() {
System out println( do something interesting here );
fireDoMyAction();//通知監(jiān)聽器
}
}
lishixinzhi/Article/program/Java/hx/201311/26237
新聞名稱:觀察者模式j(luò)ava代碼 java 觀察者模式 流程審批
標題URL:http://www.ef60e0e.cn/article/dosecic.html