十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
第一個(gè)

專注于為中小企業(yè)提供成都網(wǎng)站制作、網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)海南州免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
public interface RandomNumberListener {//接口
public void numberChanged(double d);
}
第二個(gè)
public class Consol implements RandomNumberListener{
@Override
public void numberChanged(double d) {
System.out.println(d);
}
}
第三個(gè)
public class SwingWindow
extends JFrame
implements RandomNumberListener{//觀察者
private JLabel label = new JLabel();
public SwingWindow(){
this.getContentPane().add( label);
this.setSize(300,200);
this.setVisible(true);
}
@Override
public void numberChanged(double d) {
label.setText(String.valueOf(d));
}
}
第四個(gè)
public class RandomNumber {//業(yè)務(wù)
private double r;
private ListRandomNumberListener listeners = new ArrayListRandomNumberListener();
//添加所有觀察者
public void addRandomNumberListener(RandomNumberListener lis){
listeners.add(lis);
}
public void random(){
r = Math.random();
//數(shù)據(jù)發(fā)生改變,通知所有的觀察者
for (RandomNumberListener lis : listeners) {
lis.numberChanged(r);
}
}
}
第五個(gè)
public class Test {
public static void main(String[] args) throws InterruptedException{
RandomNumber rn = new RandomNumber();
SwingWindow sw = new SwingWindow();
Consol c = new Consol();
rn.addRandomNumberListener(sw);
rn.addRandomNumberListener(c);
while(true){
rn.random();
Thread.sleep(new Random().nextInt(3000)+1000L);
}
}
}
import?java.util.ArrayList;
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);
}
}
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 VectorInvoker observerList = new VectorInvoker();
public void addObserver(Observer o) {
observerList.add(new Invoker(o));
}
public void removeObserver(Observer o) {
IteratorInvoker 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();
}
}
觀察者模式的精髓在于注冊(cè)一個(gè)觀察者觀測(cè)可能隨時(shí)變化的對(duì)象,對(duì)象變化時(shí)就會(huì)自動(dòng)通知觀察者,
這樣在被觀測(cè)對(duì)象影響范圍廣,可能引起多個(gè)類的行為改變時(shí)很好用,因?yàn)闊o需修改被觀測(cè)對(duì)象的代碼就可以增加被觀測(cè)對(duì)象影響的類,這樣的設(shè)計(jì)模式使得代碼易于管理和維護(hù),并且減少了出錯(cuò)幾率
至于異步機(jī)制實(shí)際是個(gè)噱頭,可以有觀測(cè)對(duì)象來實(shí)現(xiàn)異步,也可以有觀察者自身實(shí)現(xiàn),這個(gè)程序?qū)嶋H是觀測(cè)對(duì)象實(shí)現(xiàn)了異步機(jī)制,方法是在觀察者類外包裝了一層invoker類