设计模式之观察者模式

设计模式之观察者模式

观察者对象Observer
目标对象Subject
观察者设计模式适用于用户订阅栏目,然后在每次发布新消息的时候自动给订阅用户发送消息。我这里拿天气预报做例子,天气作为目标对象市民作为观察者对象
每次在天气预报更新天气信息后,自动给订阅的市民推送天气预报
直接上代码
目标对象接口(Subject )
public interface Subject {
    void attach(Observer o);
    void remove(Observer o);
    void notifyObservers(String subjectState);
}

目标对象类(SubjectImpl )实现目标对象接口
import java.util.ArrayList;
import java.util.List;
public class SubjectImpl implements Subject {
    private List<Observer> observerList=new ArrayList<Observer>();
    private String subjectState;
    @Override
    public void attach(Observer o) {
        observerList.add(o);
    }
    @Override
    public void remove(Observer o) {    
        observerList.remove(o);
    }
    @Override
    public void notifyObservers(String subjectState) {  
        System.out.println("目标对象发送消息:"+subjectState);
        for (Observer o : observerList) {
            o.update(subjectState);
        }
    }
    public SubjectImpl() {
        super();    
    }
    public String getSubjectState() {
        return subjectState;
    }
    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
        notifyObservers(subjectState);
    }   
}

观察者对象接口(Observer)
public interface Observer {
    void update(String subjectState);
}

观察者对象类(ObserverImpl )实现观察者对象接口
public class ObserverImpl implements Observer {
    private String name;
    private String observerState;
    @Override
    public void update(String subjectState) {
        setObserverState(subjectState); 
    }
    public ObserverImpl() {
        super();        
    }   
    public ObserverImpl(String name) {
        super();
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getObserverState() {
        return observerState;
    }
    public void setObserverState(String observerState) {
        this.observerState = observerState;     
        System.out.println("观察者对象"+name+"接收到了:"+observerState);
    }   
}

测试观察者模式
public class TestObserverPattern {
    public static void main(String[] args) {    
        ObserverImpl observer=new ObserverImpl("林飞凤");
        ObserverImpl observer2=new ObserverImpl("涂志海");
        SubjectImpl subject=new SubjectImpl();
        subject.attach(observer);
        subject.attach(observer2);
        subject.setSubjectState("厦门天气预报:今天多云,局部可能会有中雨,请做好下雨措施");
    }
}

结果:

目标对象发送消息:厦门天气预报:今天多云,局部可能会有中雨,请做好下雨措施
观察者对象林飞凤接收到了:厦门天气预报:今天多云,局部可能会有中雨,请做好下雨措施
观察者对象涂志海接收到了:厦门天气预报:今天多云,局部可能会有中雨,请做好下雨措施
自己的一点点理解,如有不对,欢迎指正。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值