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必须通知事情,但这没关系,因为我没有其他办法。