设计模式(三) 观察者模式

一:定义观察者接口,定义更新的方法

public interface Observer {
    void update();
}

二:定义操作者接口

public interface Operator {
    public void addObserver(Observer obserber);
    public void deleteObserver(Observer obserber);
    public void notifyAllObservers();
    public void operate();

}

三:实现操作者接口抽象类

这里使用vector作为观察者合集,因为Vector是线程安全的,如果使用Arraylist建议使用同步锁.

notifyAllObservers()中使用了三种遍历Vector的方法,三选一即可.

public abstract class  AbstractOperator implements Operator {

    Vector vector = new Vector<>();
    //ArrayList  list = new ArrayList(); 也可以用List 线程不安全,与synchronized结合使用


    @Override
    public void addObserver(Observer obserber) {
        vector.add(obserber);
    }

    @Override
    public void deleteObserver(Observer obserber) {
        vector.remove(obserber);
    }

    @Override
    public void notifyAllObservers() {
        int size = vector.size();
        //1.遍历1
        for (int i = 0; i < size; i++) {
            Observer observer = vector.get(i);
            observer.update();
        }

        //2.遍历2
        Enumeration elements = vector.elements();
        while (elements.hasMoreElements()) {
            Observer observer = elements.nextElement();
            observer.update();
        }


        //3.遍历3
        Iterator iterator = vector.iterator();
        while(iterator.hasNext()) {
            Observer observer = iterator.next();
            observer.update();
        }


    }

}

四:定义操作者实体类

public class MyOpertor extends AbstractOperator {
    @Override
    public void operate() {
        System.out.println("操作数据");
        notifyAllObservers();
    }
}

五:不同观察者实现类

public class ObserVerA implements Observer{
    @Override
    public void update() {
        System.out.print("这是A的操作");
    }
}

public class ObserverB implements Observer {
    @Override
    public void update() {
        System.out.print("这是B的操作");
    }
}

六:调用

       MyOpertor myOpertor = new MyOpertor();
        ObserVerA obserVerA = new ObserVerA();
        ObserverB observerB = new ObserverB();

        myOpertor.addObserver(obserVerA);
        myOpertor.addObserver(observerB);

        myOpertor.notifyAllObservers();

优化版:

Observer

public interface ObserVer {
    void onchange();
}

Optionor:
 

public abstract class Optionor {

    Vector vector;

    public void registor() {
        if (vector == null) {
            vector = new Vector();
        }
    }

    public void add(T verctor) {
        vector.add(verctor);
    }

    public void remove(T verctor) {
        vector.remove(verctor);
    }

    public void removeRegistor() {
        if (vector != null) {
            vector.clear();
        }
    }

}
AbStracOptionor:
public abstract class AbStracOptionor extends Optionor {

    public void notifyAllDataChange() {
        Enumeration elements = vector.elements();
        if(elements.hasMoreElements()) {
            elements.nextElement().update();
        }
    }

}

一般观察者遵循,随用随取原则,不用就立即销毁的原则.如果AbstractOperator 中增加register 和 unregister 方法就更加完美了,当我们不需要观察者观察操作者数据操作时,我们就移除观察者,便于优化我们的系统,及时的释放内存.安卓中的ListView 中的适配器BaseAdapter 数据绑定就采用了这种模式,具体见博客 https://blog.csdn.net/startCrazyActivity/article/details/81260581

欢迎大家留言评论相互学习.

你可能感兴趣的:(android,java)