Java观察者模式问题?

Java观察者模式问题?,java,observer-pattern,Java,Observer Pattern,我有以下观察员: public class Fisc implements Observer { double value1; double value2; private static HashMap<String, Deposit> accounts=new HashMap<String,Deposit>(); public Fisc(String cnp,Deposit deposit) { System.out.println("\n*******Obs

我有以下观察员:

public class Fisc implements Observer {
double value1;
double value2;
private static HashMap<String, Deposit> accounts=new HashMap<String,Deposit>();
public Fisc(String cnp,Deposit deposit) {

    System.out.println("\n*******Observer*******Watching account:"+id);
    accounts.put(id, deposit);

}

public void update(Observable obj, Object arg) {
    if (arg instanceof Deposit) {
        value1 =((Deposit) arg).getvalue1();
        value2=((Deposit) arg).getvalue2();
        System.out.println("\n*******Observer*******value1 current value:"+value1);
        System.out.println("*******Observer*******value2 current value:"+value2);
    } else {
        System.out.println("Observable error!");
    }
}
}
公共类Fisc实现了Observer{
双值1;
双重价值2;
私有静态HashMap帐户=新HashMap();
公共Fisc(字符串cnp、存款){
System.out.println(“\n*********观察者******观察帐户:+id”);
账户。存款(身份证、存款);
}
公共无效更新(可观察对象、对象参数){
if(arg存款实例){
value1=((存款)参数).getvalue1();
value2=((存款)参数).getvalue2();
System.out.println(“\n**********观察者*******值1当前值:“+value1”);
System.out.println(“**********观察者*******值2当前值:“+value2”);
}否则{
System.out.println(“可观测误差!”);
}
}
}
以及可观察到的:

import java.util.HashMap;
import java.util.Observable;


public class obs extends Observable {

    private static HashMap<String, Deposit> accounts;

    private static obs instance;

    private obs(HashMap<String,Deposit> accounts){
        obs.accounts=accounts;
    }

    public static obs getInstance(){
        if (instance==null){
            return new obs(new HashMap<String,Deposit>());
        }
        else return instance;
    }

        // ... some unimportant other stuff

    public void depositvalue1(String id,double value1){
        Deposit deposit=accounts.get(id);
        deposit.addvalue1(value1);

        if(deposit.isWatchedByFisc()){
            notifyFisc(deposit);
        }
        System.out.println("obs:Deposited "+value1+ " value1 to account:"+id+"!");
        System.out.println("obs:Current value1 in account:"+deposit.getvalue1());
    }

    public void depositvalue2(String id,double value2){
        Deposit deposit=accounts.get(id);
        deposit.addvalue2(value2);

        if(deposit.isWatchedByFisc()){
            notifyFisc(deposit);
        }

        System.out.println("obs:Deposited "+value2+" value2 to account:"+id+"!");
        System.out.println("obs:Current value1 in account:"+deposit.getvalue2());
    }

    public void depositValues(String id,double value1,double value2){
        Deposit deposit=accounts.get(id);
        deposit.addvalue1(value1);
        deposit.addvalue2(value2);

        if(deposit.isWatchedByFisc()){
            notifyFisc(deposit);
        }

        System.out.println("obs:Deposited "+value1+ " value1 and "+value2+" value2 to account"+id+"!");
        System.out.println("obs:Current value1 in account:"+deposit.getvalue1());
    }

    public void watchAccount(String id){
        Deposit deposit=accounts.get(id);
        deposit.setWatchedByFisc(true);
        addObserver(new Fisc(id,deposit));
    }

    public void stopWatchAccount(String id){
        accounts.get(id).setWatchedByFisc(false);
        System.out.println("obs:Account "+id+" is no longer watched by Fisc!");
    }

    public void notifyFisc(Deposit deposit){
        setChanged();
        notifyObservers(deposit);
    }

}
import java.util.HashMap;
导入java.util.Observable;
公共类obs扩展可观测{
私有静态HashMap帐户;
私有静态obs实例;
私人obs(哈希映射帐户){
obs.账户=账户;
}
公共静态obs getInstance(){
if(实例==null){
返回新obs(newhashmap());
}
否则返回实例;
}
//…一些不重要的东西
public void存款值1(字符串id,双值1){
存款=账户。获取(id);
存款。增加价值1(价值1);
如果(存款.isWatchedByFisc()){
财政司司长(存款);
}
System.out.println(“obs:Deposed”+value1+“value1 to account:“+id+”!”);
System.out.println(“obs:账户中的当前值1:+deposit.getvalue1());
}
public void存款值2(字符串id,双值2){
存款=账户。获取(id);
存款。增加价值2(价值2);
如果(存款.isWatchedByFisc()){
财政司司长(存款);
}
System.out.println(“obs:Deposed”+value2+“value2 to account:“+id+”!”);
System.out.println(“obs:账户中的当前值1:+deposit.getvalue2());
}
公共值(字符串id、双值1、双值2){
存款=账户。获取(id);
存款。增加价值1(价值1);
存款。增加价值2(价值2);
如果(存款.isWatchedByFisc()){
财政司司长(存款);
}
系统输出打印项次(“obs:存入”+value1+“value1”和“+value2+“value2到账户”+id+“!”);
System.out.println(“obs:账户中的当前值1:+deposit.getvalue1());
}
公共帐户(字符串id){
存款=账户。获取(id);
存款。由FISC监控(真实);
addObserver(新Fisc(id,存款));
}
公共无效StopWatch帐户(字符串id){
accounts.get(id).setWatchedByFisc(false);
System.out.println(“obs:Account”+id+“不再被Fisc监视!”);
}
公共FISC(存款){
setChanged();
(存款);
}
}
除以下内容外,所有内容都可以正常工作:如果我使用
depositValue(1,2,s)
方法而不是一次获取消息,那么我会收到相同的消息,即我注册了要监视的存款的次数。我怎样才能解决这个问题

希望这是有意义的。提前感谢,如果这是一个愚蠢的问题,很抱歉,这是第一次使用观察者模式

我猜这行可能(多个实例?):
addObserver(新的Fisc(id,存款))

每当
存款
实例发生变化时,都会通知每个观察者(Fisc的实例)。因此,对于您的代码,每个
Fisc
都必须查看通知消息并检查是否与存款有关

如果你不想这样,那么你应该让
存款
可见(而不是观察整个银行)。然后,您可以将侦听器注册到各个存款。

每当存款
实例发生更改时,都会通知每个观察者(Fisc的一个实例)。因此,对于您的代码,每个
Fisc
都必须查看通知消息并检查是否与存款有关


如果你不想这样,那么你应该让
存款
可见(而不是观察整个银行)。然后,您可以将侦听器注册到单个存款。

您将所有帐户集中在同一个
可观察对象中,这就是您获得
每个帐户通知一次

更好的模型可能是引入一个
帐户
类,并使其
可见

我建议如下:

public class Account extends Observable {

    private String id;    
    private BigDecimal balance = new BigDecimal("0.0");

    public Account(String id) {
      this.id = id;
    }

    public BigDecimal getBalance() {
        return balance;
    }

    public void deposit(BigDecimal amount) {
        balance = balance.add(amount);
        notifyObservers();
    }

    public void withdraw(BigDecimal amount) {
        balance = balance.subtract(amount);
        notifyObservers();
    }
}
然后,您的
obs
类将包含
帐户的列表:

private Map<String, Account> accounts = new HashMap<String, Account>();
private Map accounts=new HashMap();

请注意,这个类使用BigDecimal来表示余额,因为它是。

您已经将所有帐户集中在同一个
可观察对象中,这就是为什么
每个帐户通知一次

更好的模型可能是引入一个
帐户
类,并使其
可见

我建议如下:

public class Account extends Observable {

    private String id;    
    private BigDecimal balance = new BigDecimal("0.0");

    public Account(String id) {
      this.id = id;
    }

    public BigDecimal getBalance() {
        return balance;
    }

    public void deposit(BigDecimal amount) {
        balance = balance.add(amount);
        notifyObservers();
    }

    public void withdraw(BigDecimal amount) {
        balance = balance.subtract(amount);
        notifyObservers();
    }
}
然后,您的
obs
类将包含
帐户的列表:

private Map<String, Account> accounts = new HashMap<String, Account>();
private Map accounts=new HashMap();

请注意,此类使用BigDecimal表示余额,因为它是。

我会在调试器中逐步检查您的代码,看看它为什么没有按预期运行。
Fisc
类的代码在哪里?我会在调试器中逐步检查您的代码,看看它为什么没有按预期运行。
Fisc
类的代码在哪里?除了在概念上,这是要做的事情级别,我的obs必须通知事情,但这没关系,因为我没有其他办法。这是我要做的事情,只是在概念级别,我的obs必须通知事情,但这没关系,因为我没有其他办法。