设计模式之观察者模式

来源:互联网 发布:淘宝快捷支付怎么取消 编辑:程序博客网 时间:2024/06/09 16:19

public interface IObserver {
    public void update(IObserverable observerable);
}

public class PersonObserver implements IObserver {

    @Override
    public void update(IObserverable observerable) {
        System.out.println("个人收到预警  "+observerable.reportTemperature());
    }

}

public class CompanyObserver implements IObserver {

    @Override
    public void update(IObserverable observerable) {
        System.out.println("公司收到预警  "+observerable.reportTemperature());
    }

}

public class GovermentObserver implements IObserver {

    @Override
    public void update(IObserverable observerable) {
        System.out.println("政府收到预警  "+observerable.reportTemperature());
    }

}


/**

 * 被观察者
 * @author 熊诗言
 *
 */
public interface IObserverable {
    public boolean add(IObserver observer);
    public boolean remove(IObserver observer);
    public void notifyAllObserver();
    
    public void setTemperature(float temperature);
    public String reportTemperature();
}

public class Subject implements IObserverable {

    private float temperature;
    private String waringLevel;
    private List<IObserver> list = new ArrayList<IObserver>();
    @Override
    public boolean add(IObserver observer) {
        if(observer!=null && !list.contains(observer)){
            return list.add(observer);
        }
        return false;
    }

    @Override
    public void notifyAllObserver() {
        System.out.println("气象部门发布 " + waringLevel + "警报");
        Iterator<IObserver> itr = list.iterator();
        while (itr.hasNext()) {
            itr.next().update(this);
            
        }
    }

    @Override
    public boolean remove(IObserver observer) {
        return this.list.remove(observer);
    }

    @Override
    public String reportTemperature() {
        return "温度:"+this.temperature;
    }

    @Override
    public void setTemperature(float temperature) {
        this.temperature = temperature;
        this.invoke();
    }

    private void invoke() {
        if(this.temperature>=35){
            if(this.temperature>=35 && this.temperature<37 ){
                this.waringLevel = "黄色";
            }else if(this.temperature>=37 && this.temperature<40 ){
                this.waringLevel = "橙色";
            }else {
                this.waringLevel = "红色";
            }
            this.notifyAllObserver();
        }
    }

}


测试

public class Client {
    public static void main(String[] args) {
        IObserverable observerable = new Subject();
        observerable.add(new PersonObserver());
        observerable.add(new GovermentObserver());
        observerable.add(new CompanyObserver());
        int i = 0;
        Random random = new Random();
        while(++i<10){
            observerable.setTemperature(random.nextInt(45));
        }
    }

}



0 0