"观察者模式"-之Java,Android面试必问设计模式(8/9)

大家好,现在我们开始讲解8个必问模式中的第八种:观察者模式

观察者模式

举几个简单的生活例子:

  • 1.比如你特别关注了某个的空间动态或者微信,当他们的信息更新的时候,你就会看到提醒信息,好比1千万个微博粉丝,当他们的偶像更新了一条说说,那么他们就会收到提醒.
  • 2.又如订阅:你订阅了某篇文章,如果后续有改动,就会通知你
  • 3.通俗说法:当一个对象放生变化,那么依赖这个对象的其他对象会收到通知,并且随之改变,是一种”一对多关系”

代码:

1.一个观察者接口-(粉丝接口)

有更新的方法-(每个粉丝收到信息的举动)

2.多个”具体的观察者类”实现接口(一个个具体的粉丝)

更新的方法-(每个粉丝收到信息的不同反应)

2.管理类的接口-(即空间系统接口)

增删(观察者),通知,自身操作方法-(检测你们谁关注了,后面通知你们)

3.新建一个管理的”抽象类”实现管理类接口

1.不写但相当于"也有了"实现所有的方法.
2.那么如果想改具的方法,那么只需要重写想改的.
(1.新建一个集合,存各个观察者的方法)
(2.删各个观察者的方法)
(3.通知方法里,遍历,调用更新的方法)

4.写一个真正的具体类,继承抽象类.-为了简洁,就分开了
自身操作的方法,调用通知的方法

代码

//观察者接口,有更新的方法
interface Observer {
    void update();
}

//具体的实现对象
class Oberver1 implements Observer {

    @Override
    public void update() {
        System.out.println("person 1 had received...");
    }
}

class Oberver2 implements Observer {

    @Override
    public void update() {
        System.out.println("person 2 hand received...");
    }
}
class Oberver3 implements Observer {

    @Override
    public void update() {
        System.out.println("person 3 hand received...");
    }
}

//操作接口
interface Subject {
    void add(Observer obs);

    void del(Observer obs);

    void notification();

    void operation();
}

//抽象类,实现接口,相当于有了那么多的方法了
abstract class AbstractSubjet implements Subject {
    Vector<Observer> mVector = new Vector();

    //三个方法改动,我就重写3个方法
    @Override
    public void add(Observer observer) {
        mVector.add(observer);
    }

    @Override
    public void del(Observer observer) {
        mVector.remove(observer);
    }

    @Override
    public void notification() {
        //遍历集合通知
        Enumeration elements = mVector.elements();
        while (elements.hasMoreElements()) {
            Observer o = (Observer) elements.nextElement();
            //调用通知
            o.update();
        }
    }
}

//具体类,继承了抽象类,只重写操作类即可
class MySubjet extends AbstractSubjet {

    @Override
    public void operation() {
        notification();//调用自己继承的
    }
}
//测试类
public class ObserverTest {
    public static void main(String[] args) {
        Subject subject = new MySubjet();//指向子类对象,跨子类对象
        Oberver3 oberver3 = new Oberver3();
        subject.add(new Oberver1());
        subject.add(new Oberver2());
        subject.add(oberver3);

        subject.operation();
        System.out.println("--------------------remove----------------------");
        subject.del(oberver3);
        subject.operation();
    }
}

打印结果:

person 1 had received...
person 2 hand received...
person 3 hand received...
--------------------remove----------------------
person 1 had received...
person 2 hand received...
总结:
1.实现了通观察者接口的多个观察者
2.管理接口,定义操作方法
3.管理"抽象类"-实现-"管理接口",但只重写详细的操作方法:增加,删除,通知
4.管理的"具体类"-**继承**抽象类,重写一条方法-比如这里的"操作方法",就能完成方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值