當前位置:首頁 » 編程語言 » java觀察者

java觀察者

發布時間: 2022-09-23 13:07:08

A. 求 java 非同步觀察者模式 的源代碼(完整的),不要同步的,好的給加分

package TestObserver;

import java.util.Iterator;
import java.util.Vector;

/**
*
* @author Seastar
*/
interface Observed {

public void addObserver(Observer o);

public void removeObserver(Observer o);

public void update();
}

interface Observer {

public void takeAction();
}

class Invoker {

private Observer o;
Handler handler;

public Invoker(Observer o) {
new Handler();
this.o = o;
}

private class Handler extends Thread {

public Handler() {
handler = this;
}

@Override
public void run() {
o.takeAction();
}
}

public boolean TestSameObserver(Observer o) {
return o == this.o;
}

public void invoke() {
handler.start();
}
}

class ObservedObject implements Observed {

private Vector<Invoker> observerList = new Vector<Invoker>();

public void addObserver(Observer o) {
observerList.add(new Invoker(o));
}

public void removeObserver(Observer o) {
Iterator<Invoker> it = observerList.iterator();
while (it.hasNext()) {
Invoker i = it.next();
if (i.TestSameObserver(o)) {
observerList.remove(i);
break;
}
}
}

public void update() {
for (Invoker i : observerList) {
i.invoke();
}
}
}

class ObserverA implements Observer {

public void takeAction() {
System.out.println("I am Observer A ,state changed ,so i have to do something");
}
}

class ObserverB implements Observer {

public void takeAction() {
System.out.println("I am Observer B ,i was told to do something");
}
}

class ObserverC implements Observer {

public void takeAction() {
System.out.println("I am Observer C ,I just look ,and do nothing");
}
}

public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ObserverA a = new ObserverA();
ObserverB b = new ObserverB();
ObserverC c = new ObserverC();
ObservedObject oo = new ObservedObject();
oo.addObserver(a);
oo.addObserver(b);
oo.addObserver(c);
for (int i = 0; i < 5; ++i) {
oo.addObserver(new Observer() {

public void takeAction() {
System.out.println("我是山寨觀察者"+",誰敢攔我");
}
});
}
//sometime oo changed ,so it calls update and informs all observer
oo.update();
}
}

觀察者模式的精髓在於注冊一個觀察者觀測可能隨時變化的對象,對象變化時就會自動通知觀察者,
這樣在被觀測對象影響范圍廣,可能引起多個類的行為改變時很好用,因為無需修改被觀測對象的代碼就可以增加被觀測對象影響的類,這樣的設計模式使得代碼易於管理和維護,並且減少了出錯幾率

至於非同步機制實際是個噱頭,可以有觀測對象來實現非同步,也可以有觀察者自身實現,這個程序實際是觀測對象實現了非同步機制,方法是在觀察者類外包裝了一層invoker類

B. Java的回調函數和觀察者模式的區別

java的回調 叫listener 模式。
無論是listener模式,還是C++裡面的callback模式,本質是一樣的
他們都是觀察者模式的具體實現。

觀察者模式是設計模式中定義的一種思想,而具體到不同的語言環境,使用不同的語法表現出來就會有java的listener objc的 delegate,或者C++的 callback。

C. java繪圖ImageObserver observer,觀察者是什麼意思

public interface ImageObserver
用於在構造 Image 時,接收有關 Image 信息通知的非同步更新介面。
欄位摘要
static int ABORT
imageUpdate 的 infoflags 參數中的此標志指示被非同步跟蹤的圖像在生成完成前即已中止。
static int ALLBITS
imageUpdate 的 infoflags 參數中的此標志指示現在已完成了一幅以前繪制的靜態圖像,並且可以其最終形式再次繪制它。
static int ERROR
imageUpdate 的 infoflags 參數中的此標志指示被非同步跟蹤的圖像遇到了錯誤。
static int FRAMEBITS
imageUpdate 的 infoflags 參數中的此標志指示多幀圖像(以前繪制的)的另一個完整幀現在可以再次繪制。
static int HEIGHT
imageUpdate 的 infoflags 參數中的此標志指示基本圖像的高度現在可用,並且可從 height 參數中獲取此高度到 imageUpdate 回調方法。
static int PROPERTIES
imageUpdate 的 infoflags 參數中的此標志指示該圖像的屬性現在可用。
static int SOMEBITS
imageUpdate 的 infoflags 參數中的此標志指示已提供了繪制圖像縮放變體所需的更多像素。
static int WIDTH
imageUpdate 的 infoflags 參數中的此標志指示基本圖像的寬度現在可用,並且可從 width 參數中獲取此寬度到 imageUpdate 回調方法。

D. JAVA觀察者模式(observer pattern)

importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.Random;

importjavax.swing.event.ChangeEvent;
importjavax.swing.event.ChangeListener;


{
privateHashMap<String,Stock>hmStocks=newHashMap<String,Stock>();

privateHashMap<String,ArrayList<ChangeListener>>hmCL=newHashMap<String,ArrayList<ChangeListener>>();

publicStockLists()
{
init(100);
newThread(this).start();
}

publicvoidrun()
{
Randomrand=newRandom();
while(true)
{
try
{
Thread.sleep(100);
Stocks=randStock();
s.price=rand.nextFloat();
ArrayList<ChangeListener>alCL=hmCL.get(s.symbol);
if(alCL==null)
{
continue;
}
for(ChangeListenercl:alCL)
{
cl.stateChanged(newChangeEvent(s));
}
}
catch(InterruptedExceptione)
{
e.printStackTrace();
}
}
}

privateStockrandStock()
{
Randomrand=newRandom();
intidx=rand.nextInt(hmStocks.size());
Stringsym=(String)hmStocks.keySet().toArray()[idx];
Stocks=hmStocks.get(sym);
returns;
}

(ChangeListenercl,Stringsym)
{
ArrayList<ChangeListener>al=hmCL.get(sym);
if(al==null)
{
al=newArrayList<ChangeListener>();
hmCL.put(sym,al);
}
returnal.add(cl);
}

privatevoidinit(intcount)
{
Randomrand=newRandom();

for(inti=0;i<count;i++)
{
Stringsym=randSym(rand);
floatp=rand.nextFloat();
Stocks=newStock(sym,p);
hmStocks.put(sym,s);
}
}

privateStringrandSym(Randomrand)
{
char[]ca=newchar[3];
for(inti=0;i<ca.length;i++)
{
ca[i]=(char)('A'+rand.nextInt(26));
}
returnnewString(ca);
}

publicstaticvoidmain(String[]args)
{
StockListssl=newStockLists();
sl.addChangeListener(newInvestor("111"),sl.randStock().symbol);
sl.addChangeListener(newInvestor("222"),sl.randStock().symbol);
sl.addChangeListener(newInvestor("333"),sl.randStock().symbol);
sl.addChangeListener(newInvestor("444"),sl.randStock().symbol);
sl.addChangeListener(newInvestor("555"),sl.randStock().symbol);
sl.addChangeListener(newInvestor("666"),sl.randStock().symbol);
sl.addChangeListener(newInvestor("777"),sl.randStock().symbol);
sl.addChangeListener(newInvestor("888"),sl.randStock().symbol);
sl.addChangeListener(newInvestor("999"),sl.randStock().symbol);
sl.addChangeListener(newInvestor("000"),sl.randStock().symbol);
}
}

classStock
{
publicStringsymbol=null;
publicfloatprice=0.0f;

publicStock(Stringsym,floatp)
{
symbol=sym;
price=p;
}

publicStringtoString()
{
returnsymbol+":"+price;
}
}


{

publicStringname="";

publicInvestor(Stringname)
{
this.name=name;
}

@Override
publicvoidstateChanged(ChangeEvente)
{
Stocks=(Stock)e.getSource();
System.out.println("Hello,"+name+":STOCKCHANGED:"+s);
}
}

E. java23個設計模式有哪些

一共23種設計模式!
引用《軟體秘笈-設計模式那點事》書籍:
按照目的來分,設計模式可以分為創建型模式、結構型模式和行為型模式。
創建型模式用來處理對象的創建過程;結構型模式用來處理類或者對象的組合;行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述。
創建型模式用來處理對象的創建過程,主要包含以下5種設計模式:

工廠方法模式(Factory
Method
Pattern)

抽象工廠模式(Abstract
Factory
Pattern)

建造者模式(Builder
Pattern)

原型模式(Prototype
Pattern)

單例模式(Singleton
Pattern)
結構型模式用來處理類或者對象的組合,主要包含以下7種設計模式:

適配器模式(Adapter
Pattern)

橋接模式(Bridge
Pattern)

組合模式(Composite
Pattern)

裝飾者模式(Decorator
Pattern)

外觀模式(Facade
Pattern)

享元模式(Flyweight
Pattern)

代理模式(Proxy
Pattern)
行為型模式用來對類或對象怎樣交互和怎樣分配職責進行描述,主要包含以下11種設計模式:

責任鏈模式(Chain
of
Responsibility
Pattern)

命令模式(Command
Pattern)

解釋器模式(Interpreter
Pattern)

迭代器模式(Iterator
Pattern)

中介者模式(Mediator
Pattern)

備忘錄模式(Memento
Pattern)

觀察者模式(Observer
Pattern)

狀態模式(State
Pattern)

策略模式(Strategy
Pattern)

模板方法模式(Template
Method
Pattern)

訪問者模式(Visitor
Pattern)

F. 為什麼rxjava 被觀察者方法叫subscribe

而RxJava作為一個工具庫,使用的就是通用形式的觀察者模式。RxJava的觀察者模式RxJava有四個基本概念:Observable(可觀察者,即被觀察者)、Observer(觀察者)、subscribe(訂閱)、事件。Observable和Observer通過subscribe()方法實

G. java觀察者模式監測多個線程

觀察者設計模式定義了對象間的一種一對多的依賴關系,以便一個對象的狀態發生變化時,所有依賴於它的對象都得到通知並自動刷新。
反之過來,監測多個線程是可以的,
不過需要自己動手設置一番。讓觀察者接受多個被觀察者動態,根據不同線程動態再進行實現。

H. java中常用的設計模式有哪些

1.單例模式(有的書上說叫單態模式其實都一樣)
該模式主要目的是使內存中保持1個對象
2.工廠模式
該模式主要功能是統一提供實例對象的引用。看下面的例子:
public class Factory{
public ClassesDao getClassesDao(){
ClassesDao cd = new ClassesDaoImpl();
return cd;
}
}
interface ClassesDao{
public String getClassesName();
}
class ClassesDaoImpl implements ClassesDao {
public String getClassesName(){
System.out.println("A班");
}
}
class test
{
public static void main(String[] args){
Factory f = new Factory();
f.getClassesDao().getClassesName();
}
}
這個是最簡單的例子了,就是通過工廠方法通過介面獲取對象的引用
3.建造模式
該模式其實就是說,一個對象的組成可能有很多其他的對象一起組成的,比如說,一個對象的實現非常復雜,有很多的屬性,而這些屬性又是其他對象的引用,可能這些對象的引用又包括很多的對象引用。封裝這些復雜性,就可以使用建造模式。
4.門面模式
這個模式個人感覺像是Service層的一個翻版。比如Dao我們定義了很多持久化方法,我們通過Service層將Dao的原子方法組成業務邏輯,再通過方法向上層提供服務。門面模式道理其實是一樣的。
5.策略模式
這個模式是將行為的抽象,即當有幾個類有相似的方法,將其中通用的部分都提取出來,從而使擴展更容易。

I. java中的設計模式都有哪些

Java中的23種設計模式:
Factory(工廠模式), Builder(建造模式), Factory Method(工廠方法模式),
Prototype(原始模型模式),Singleton(單例模式), Facade(門面模式),
Adapter(適配器模式), Bridge(橋梁模式), Composite(合成模式),
Decorator(裝飾模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解釋器模式), Visitor(訪問者模式),
Iterator(迭代子模式), Mediator(調停者模式), Memento(備忘錄模式),
Observer(觀察者模式), State(狀態模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(責任鏈模式)

熱點內容
python安裝後怎麼打開 發布:2025-01-10 11:08:35 瀏覽:870
phpjava架構 發布:2025-01-10 10:56:06 瀏覽:382
python二維排序 發布:2025-01-10 10:56:00 瀏覽:607
南水北調怎麼配置 發布:2025-01-10 10:55:27 瀏覽:121
廣數980系統參數密碼是多少 發布:2025-01-10 10:55:25 瀏覽:577
androidhtml字體 發布:2025-01-10 10:55:01 瀏覽:787
資料庫連接工廠模式 發布:2025-01-10 10:51:00 瀏覽:487
mac文件夾路徑設置 發布:2025-01-10 10:48:12 瀏覽:803
shell腳本自動密碼 發布:2025-01-10 10:46:29 瀏覽:766
安卓手機怎麼切兩個屏 發布:2025-01-10 10:33:51 瀏覽:684