设计模式之观察者模式

 观察者(Observer)模式是对象的行为型模式,又叫做发表-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-收听者(Source/Listener)模式或从属者(Dependents)模式。
  
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
角色:

  • 抽象主题(Subject)角色:主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;

  • 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到通知时更新自己;

  • 具体主题(ConcreteSubject)角色:保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色;

  • 具体观察者(ConcreteObserver)角色:保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。

Java自带的观察者模式:

import java.util.Observable;

//  主题角色   通知  观察者  我发生了改变
public class ThemeRole extends Observable{

    public static void main(String[] args) {

        ThemeRole t = new ThemeRole();
        ObserverRole o = new ObserverRole();
        MyInter o_2 = new MyInter();
        t.setChanged();
        t.addObserver(o);
        t.addObserver(o_2);
        t.notifyObservers("我是主题角色");
    }
}
import java.util.Observable;
import java.util.Observer;

/*
 * 观察者角色
 */
public class ObserverRole implements Observer{
    //  更新方法
    @Override
    public void update(Observable o, Object arg) {
        System.out.println("update:"+arg);
    }

}
import java.util.Observable;
import java.util.Observer;
/**
*观察者角色
*/
public class MyInter implements Observer{

    @Override
    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        System.out.println("MyInter:"+arg);
    }
}

自己设计的一种观察者模式:

实体类:用来传递消息

public class Bean {

    private String name;

    public Bean(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }



}

抽象的观察者类

public interface Look {

    void getMessage(Bean bean);
}

抽象的主题类


public interface Looked {

    void addLook(Look look);

    void removeLook(Look look);

    void notifyMessage(Bean bean);
}

具体的观察者类


public class MyLook implements Look{

    @Override
    public void getMessage(Bean bean) {
        // TODO Auto-generated method stub
        System.out.println(bean.getName());
    }
}

具体的主题类


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


public class MyLooked implements Looked{

    List<Look> list_look = new ArrayList<Look>();

    @Override
    public void addLook(Look look) {
        // TODO Auto-generated method stub
        list_look.add(look);
    }

    @Override
    public void removeLook(Look look) {
        // TODO Auto-generated method stub
        list_look.remove(look);
    }

    @Override
    public void notifyMessage(Bean bean) {
        // TODO Auto-generated method stub
        for(Look lo:list_look){
            lo.getMessage(bean);
        }
    }

}

测试类


public class Test {
    public static void main(String[] args) {
        MyLook m = new MyLook();
        MyLooked med = new MyLooked();
        med.addLook(m);
        Bean bean = new Bean("测试");
        med.notifyMessage(bean);    
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值