package observable;
// grensesnittet for varsling om Idol-endringer
public interface IdolFan {
    // lytter-metode fra IdolFan-grensesnittet
    public void noeEndret(Idol idol, String egenskap);
}
 
package observable;
import java.util.ArrayList;
import java.util.Collection;
import javafx.scene.paint.Color;
public class Idol {
    
    // konstanter for hårfarge- og hårlengde-egenskapene
    public final static String HÅRFARGEEGENSKAP = "hårfarge";
    public final static String HÅRLENGDEEGENSKAP = "hårlengde";
    
    // felt for hårfarge- og hårlengde-egenskapene
    private Color hårfarge;
    private int hårlengde;
    // lytter-lista, bruker Collection som type, siden vi bare bruker add og remove
    private Collection<IdolFan> idolFans = new ArrayList<IdolFan>();
    
    // getter og setter for hårfarge-egenskapen
    public Color getHårfarge() {
        return hårfarge;
    }
    
    public void setHårfarge(Color hårfarge) {
        Color forrigeHårfarge = this.hårfarge;
        this.hårfarge = hårfarge;
        if (this.hårfarge != forrigeHårfarge) {
            siFraOmNoeEndret(HÅRFARGEEGENSKAP);
        }
    }
    
    // getter og setter for hårlengde-egenskapen
    
    public int getHårlengde() {
        return hårlengde;
    }
    public void setHårlengde(int hårlengde) {
        this.hårlengde = hårlengde;
        siFraOmNoeEndret(HÅRLENGDEEGENSKAP);
    }
    // håndtering av lyttere
    // generell hjelpemetode for å si fra om endring av egenskap
    private void siFraOmNoeEndret(String egenskap) {
        for (IdolFan idolFan : idolFans) {
            idolFan.noeEndret(this, egenskap);
        }
    }
    
    // registrer lytter
    public void addIdolFan(IdolFan idolFan) {
        idolFans.add(idolFan);
    }
    // avregistrer lytter
    public void removeIdolFan(IdolFan idolFan) {
        idolFans.remove(idolFan);
    }
}
 
package observable;
import javafx.scene.paint.Color;
public class Beundrer implements IdolFan {
    private Color hårfarge;
    public Color getHårfarge() {
        return hårfarge;
    }
    
    public void setHårfarge(Color hårfarge) {
        this.hårfarge = hårfarge;
    }
    
    // implementasjon av lytter-metode fra IdolFan-grensesnittet
    public void noeEndret(Idol idol, String egenskap) {
        if (egenskap.equals(Idol.HÅRFARGEEGENSKAP)) {
            this.setHårfarge(idol.getHårfarge());
        } else if (egenskap.equals(Idol.HÅRLENGDEEGENSKAP)) {
            System.out.println("Hårlengde endret");
            // ???
        }
    }
    
    //
    
    public static void main(String[] args) {
        Idol idol = new Idol();
        Beundrer beundrer1 = new Beundrer(), beundrer2 = new Beundrer();
        idol.addIdolFan(beundrer1);
        idol.addIdolFan(beundrer2);
        idol.setHårfarge(Color.ALICEBLUE);
        idol.setHårlengde(10);
    }
}