关于#java#的问题,如何解决?

怎样构造思路呢?设计Src和Dis两个类,Src中有一个被封装的属性,类型为int要求为非负值,每当通过特定的方法更改Src对象中的这个属性后,
Dis对象都能得到通知,并向Src发消息获得此属性值,怎样构造思路。

  • img

Src.java

public class Src{
    private int x;
    private Dis dis;

    public void setDis(Dis dis){
        this.dis=dis;
    }

    public void setX(int x){
        this.x=x;
        System.out.println("通知Dis  x的值发生变化了");
        this.dis.notice();
    }

    public int getX(){
        return this.x;
    }
}


Dis.java


public class Dis{

    private int x;

    private Src src;

    public void setSrc(Src src){
        this.src=src;
    }

    public void notice(){
        this.x=this.src.getX();
        System.out.println("收到通知  Src的值变了,最新的值为:"+this.x);
    }
}

主类


public class a
{
    public static void main(String[] args){
        Src s=new Src();
        Dis d=new Dis();
        //这里实现双向绑定
        s.setDis(d);
        d.setSrc(s);
        //改变Src x的值
        s.setX(10);

    }
}

看看能看懂吗,就是 Src 和 Dis 两个类绑定,就是 我中有你 你中有我

可以使用观察者模式来解决该题
Src.java

package base;

import java.util.ArrayList;
import java.util.List;

/**
 * 被观察者
 * 
 * @author 胡海龙
 *
 */
public class Src {

    private List<Observer> observers = new ArrayList<>();

    private int num;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
        notifyAllObservers();
    }

    public void attach(Observer o) {
        observers.add(o);
    }

    public void notifyAllObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}


Observer.java

/**
 * 观察者服务
 * 
 * @author 胡海龙
 *
 */
public abstract class Observer {

    protected Src src;

    public abstract void update();
}

Dis.java

/**
 * 观察者
 * 
 * @author 胡海龙
 *
 */
public class Dis extends Observer {

    public Dis(Src src) {
        this.src = src;
        this.src.attach(this);
    }

    @Override
    public void update() {
        System.out.println("Src is changed : " + src.getNum());
    }

}

测试类Test.java

public class Test {

    public static void main(String[] args) {
        Src src = new Src();
        new Dis(src);
        src.setNum(10);
        src.setNum(15);
    }
}

运行结果:

img

我这里只用int类型来说明问题,非负这个可以自行在代码逻辑里加入