我正在爲考試做這個小項目。我的老師關注這個uml,所以我的問題是關於我的項目中的聚合和關聯(我知道這是一個問了很多次的問題)。 該項目是一個全局觀察者,它具有Component的集合,並且每當Component(Leaf或Composite)改變其狀態時,都會通知觀察者。我的問題是關於ConcreteObserver和Component之間的聚合的正確性:ConcreteObserver有一個Component的集合,但每個Component都有一個對觀察者的引用(在Leaf和Composite中有一個觀察者)。也許我應該添加關聯組件 - > ConcreteObserver? 也許我應該改變聚合ConcreteObserver 1 - > *元件爲關聯關係ConcreteObserver1 - > *的COMUml關於我的項目中的關聯和聚合
,這裏是我的項目的整個代碼,我知道這是很長,但你要注意混凝土觀察員和混凝土構件(複合) (我不把葉,因爲它是非常相似的複合卻一直沒有孩子有關的方法來實現) 這裏是組件
//Component
public interface Component {
public void op();
public void add(Component c);
public void remove(Component c);
public List <Component> getChild();
public void setState(int x);
public int getState();
public String getName();
}
//Composite
public class Composite implements Component {
private int state;
private String name;
private Observer observer;
private List <Component> comps = new ArrayList <Component>();
public Composite(String name, Observer observer){
this.name = name;
this.observer = observer;
this.observer.add(this);
}
@Override
public void setState(int x){
this.state = x;
observer.update(name);
}
@Override
public int getState(){
return state;
}
@Override
public String getName(){
return name;
}
@Override
public void op() {
System.out.println("sono una foglia");
}
@Override
public void add(Component c) {
comps.add(c);
}
@Override
public void remove(Component c) {
comps.remove(c);
}
@Override
public List<Component> getChild() {
List <Component> cc = new ArrayList <Component>();
for (Component zen : comps){
cc.add(zen);
}
return cc;
}
}
//Observer
public abstract class Observer {
public abstract void update(String name);
public abstract void add(Component c);
}
//ConcreteObserver
public class ConcreteObserver extends Observer {
private List <Component> components = new ArrayList <Component>();
@Override
public void update(String name){
for(Component zen : components){
if(zen.getName()==name){
System.out.println("the state of " + name + " is changed, now it's " + zen.getState());
}
}
}
@Override
public void add(Component c){
components.add(c);
}
public void printAllState(){
for(Component zen : components){
System.out.println("the state of " + zen.getName() + " is " + zen.getState());
}
}
}
//main
public class Compito24Febbraio2017 {
public static void main(String[] args) {
ConcreteObserver o = new ConcreteObserver();
Composite c1 = new Composite ("c1",o);
Leaf l1 = new Leaf("l1",o);
Leaf l2 = new Leaf("l2",o);
c1.add(l1);
c1.add(l2);
c1.setState(5);
l1.setState(4);
o.printAllState();
}
}
我真的不明白,我不得不忽略聚合?所以我必須消除ConcreteObserver和Component之間的聚合? –
如果它存在與否,沒有區別。共享聚合沒有商定的語義。 –
這是因爲我在ConcreteObserver中放置了一個組件集合,所以聚合有點冗餘嗎? –