设计模式八—————观察者模式

观察者模式定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自己更新自己。
观察者模式初步理解:多个观察者同时观察同一个被观察者,被观察者状态发生变化时,会通知观察者,使得观察者内部的参数也相应改变。因为要通知被观察者,因此观察者内部要有被观察者对象的引用。因为有多个观察者,所有被观察者中要有一个集合来存放引用。因为状态发生变化时就要通知,所有发生变化时就要遍历这个集合,并调用观察者统一的更新方法,所以有必要抽象出一个观察者的更新方法。
code…


被观察者:

public class Flower {
    //被观察者的属性
    private int length;
    private String color;
    private ArrayList<Obser> arrayList=new ArrayList<>();//观察者集合
    public Flower(int length, String color) {
        this.length = length;
        this.color = color;
    }
    public int getLength() {
        return length;
    }
    public void change(int length) {
        this.length = length;
        this.Notify();
    }
    public String getColor() {
        return color;
    }
    public void change(String color) {
        this.color = color;
        this.Notify();
    }
    public void add(Obser obser)
    {
        arrayList.add(obser);
    }
    public void change(int length, String color) {
        this.length = length;
        this.color = color;
        this.Notify();
    }
    public void Notify()//通知观察者更新参数
    {
        Iterator it=arrayList.iterator();
        while(it.hasNext())
        {
            Obser obser=(Obser) it.next();
            obser.update(this);
        }
    }
}

被观察者是一朵花,有长度和颜色这两个属性。当这两个属性中的任何一个属性发生变化时,都会遍历观察者集合,传递当前对象,让观察者根据传入对象来更新自己观察的参数。
抽象的观察者类:

public abstract class Obser {
    private int length;
    private String color;

    public Obser(Flower flower) {
        flower.add(this);//将当前观察者添加到被观察者的集合当中。
    }
    public int getLength() {
        return length;
    }
    public void setLength(int length) {
        this.length = length;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public abstract void update(Flower flower);
    public abstract void show();
}

观察长度的观察者:

public class ObserLength extends Obser {
    public ObserLength(Flower flower) {
        super(flower);//告知观察者所要观察的对象
    }
    @Override public void update(Flower flower) {
       this.setLength(flower.getLength());//根据观察的对象来更新自己的参数。
    }
    public void show()
    {
        System.out.println("观察长度的结果---"+this.getLength());
    }
}

观察颜色的观察者与之类似。接下来看main方法:

public class Main {
    public static void main(String[] args) {
        Flower flower=new Flower(12,"blue");
        Obser obser1=new ObserLength(flower);
        Obser obser2=new ObserColor(flower);
        Obser obser3=new ObserAll(flower);
        flower.change(30);
        obser1.show();
        obser3.show();
        flower.change("red");
        obser2.show();
        obser3.show();
    }
}

先创建了被观察者,然后再创建观察者。创建观察者的时候要告知所要观察的对象,把观察者添加到这个对象的集合中。这一步在抽象的观察者类的构造方法中。观察者刚一创建,就被添加到集合中了。

总结:观察者模式所做的工作是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。观察者模式只是对一个对象进行观察,反应器模式是对多个对象进行观察。在NIO中用的就是反应器模式。


上一篇
---The End---
下一篇
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值