设计模式-观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个目标对象,当这个目标在状态上发生变化时,会通知所有观察者对象。

观察者模式也被称为:  发布-订阅模式 / 模型-视图模式 /源-监听器模式 / 从属者模式

优点:实现了表现层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰

          被观察的目标并不需要知道任何一个具体观察者,只知道它们都有一个共同的接口

缺点:虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制让观察者知道所观察的对象是怎么发生变化的。

下面通过各种类型的车观察红绿灯的例子来讲解观察者模式

各种类型的车继承抽象观察者,而路灯就是被观察者


package com.pattern.Observer;//抽象观察者

    interface Observer {

        public void start();

        public void stop();
    }


package com.pattern.Observer;
//货车
public class Truck implements  Observer{//具体观察者(观察红绿灯)
    @Override
    public void start() {
        System.out.println("货车启动!");
    }

    @Override
    public void stop() {
        System.out.println("货车停止!");
    }
}

package com.pattern.Observer;
//汽车

public class Car implements Observer{//具体观察者(观察红绿灯)
    @Override
    public void start() {
        System.out.println("汽车启动!");
    }

    @Override
    public void stop() {
        System.out.println("汽车停止!");

    }
}


package com.pattern.Observer;

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

public class Light {//红绿灯
    private String color;
    private List<Observer> list = new ArrayList<>();
    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
        notifyAllObserver();
    }
    public void add(Observer observer){
        list.add(observer);
    }
    public void notifyAllObserver(){
        if(color.equals("红色")){
            for(Observer o:list){
                o.stop();
            }
        }else if(color.equals("绿色")){
            for(Observer o:list){
                o.start();
            }
        }

    }
}

package com.pattern.Observer;

public class Test {
    public static void main(String[] args) {//测试类
        Observer car = new Car();
        Observer truck = new Truck();
        Light l = new Light();
        l.add(car);
        l.add(truck);
        l.setColor("红色");
        System.out.println("---------------------------");
        l.setColor("绿色");
        System.out.println("---------------------------");
        l.setColor("红色");
        System.out.println("---------------------------");
        l.setColor("绿色");
    }
}

运行结果:

汽车停止!
货车停止!
---------------------------
汽车启动!
货车启动!
---------------------------
汽车停止!
货车停止!
---------------------------
汽车启动!
货车启动!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值