07.观察者模式

1.什么是观察者模式

在对象中定义了一对多的依赖,当一个对象发生改变时,通知给其它对象

2.观察者角色

抽象主题

具体主题

抽象观察者

具体观察者

3.应用场景

消息订阅通知

4.观察者模式实现

 链接:https://pan.baidu.com/s/1glb0TXdFvK-XBSfoQ6M-5A 
提取码:idmu

1)抽象主题 

import com.demo.observer.ObServer;

/**
 * 抽象主题
 */
public interface AbstractSubject {

    /**
     * 添加观察者  注册观察者
     */
    void addObServer(ObServer obServer);

    /**
     * 移除观察者
     * @param obServer
     */
    void removeServer(ObServer obServer);

    /**
     * 通知消息
     */
    void notifyObServer(String message);
}

2)具体主题

import com.demo.observer.ObServer;
import com.demo.subject.AbstractSubject;

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

/**
 * 具体主题
 */
public class WeChatSubject implements AbstractSubject {

    private List<ObServer> obServerList = new ArrayList<ObServer>();

    /**
     * 添加观察者  注册观察者
     */
    public void addObServer(ObServer obServer) {
        obServerList.add(obServer);
    }

    /**
     * 移除观察者
     * @param obServer
     */
    public void removeServer(ObServer obServer) {
        obServerList.remove(obServer);
    }

    /**
     * 通知消息
     */
    public void notifyObServer(String message) {
        System.out.println("开始设置微信群发消息:" + message);
        // 调用观察者通知方案
        for (int i = 0; i < obServerList.size(); i++) {
            ObServer obServer = obServerList.get(i);
            //调用观察者通知方法
            obServer.update(message);
        }
    }
}

3)抽象观察者

/**
 * 抽象观察者
 */
public interface ObServer {

    /**
     * 通知观察者消息
     * @param message
     */
    void update(String message);

}

4)具体观察者

import com.demo.observer.ObServer;

/**
 * 具体观察者
 */
public class UserObServer implements ObServer {

    private String name;

    public UserObServer(String name) {
        this.name = name;
    }

    public void update(String message) {
        System.out.println(name + ",收到微信服务通知的消息:" + message);
    }
}

5)测试

import com.demo.observer.impl.UserObServer;
import com.demo.subject.AbstractSubject;
import com.demo.subject.impl.WeChatSubject;

public class Test001 {

    public static void main(String[] args) {

        // 1.创建具体的在主题
        AbstractSubject abstractSubject = new WeChatSubject();
        // 2.开始注册或者添加观察者
        abstractSubject.addObServer(new UserObServer("向前"));
        abstractSubject.addObServer(new UserObServer("向后"));
        // 3.群发消息
        abstractSubject.notifyObServer("你好");

    }
}

5.观察者模式-基于jdk实现

链接:https://pan.baidu.com/s/1cn2Tmm00vJoaHuOMlwNF1A 
提取码:t2xu

1)具体主题 

import java.util.Observable;

/**
 * 具体主题
 */
public class MessageObServable extends Observable {

    @Override
    public void notifyObservers(Object arg) {
        // 1.修改状态为可以群发
        setChanged();
        // 2.调用父类的notifyObservers 群发消息
        super.notifyObservers(arg);
    }
}

2)具体观察者

import java.util.Observable;
import java.util.Observer;

/**
 * 具体观察者
 */
public class EmailObServer implements Observer {

    public void update(Observable o, Object arg) {
        System.out.println("用户下单成功,发送邮件提醒内容:" + arg);
    }
}
import java.util.Observable;
import java.util.Observer;

/**
 * 具体观察者
 */
public class SmsObServer implements Observer {

    public void update(Observable o, Object arg) {
        System.out.println("用户下单成功,发送短信提醒内容:" + arg);
    }
}
import java.util.Observable;
import java.util.Observer;

/**
 * 具体观察者
 */
public class WechatObServer implements Observer {

    public void update(Observable o, Object arg) {
        System.out.println("用户下单成功,发送微信体醒内容:" + arg);
    }
}

3)测试

import com.demo.observer.EmailObServer;
import com.demo.observer.SmsObServer;
import com.demo.observer.WechatObServer;
import com.demo.subject.MessageObServable;

import java.util.Observable;

public class Test {

    public static void main(String[] args) {
        // 1.创建具体的主题
        Observable observable = new MessageObServable();
        // 2. 注册观察者
        observable.addObserver(new SmsObServer());
        observable.addObserver(new WechatObServer());
        observable.addObserver(new EmailObServer());
        // 3.群发消息
        observable.notifyObservers("哈哈");
    }
}

5.观察者模式-基于spring实现

链接:https://pan.baidu.com/s/18tvI_nsG6KyhsxILcTAJ_Q 
提取码:9v6k

1)pom依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.11.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.58</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
    </dependencies>

2)主题 

import com.alibaba.fastjson.JSONObject;
import org.springframework.context.ApplicationEvent;

public class OrderMessageEvent extends ApplicationEvent {

    /**
     * 群发消息的内容
     */
    private JSONObject jsonObject;

    public JSONObject getJsonObject() {
        return jsonObject;
    }

    public OrderMessageEvent(Object source, JSONObject jsonObject) {
        super(source);
        this.jsonObject = jsonObject;
    }
}

3)具体观察者

import com.demo.event.OrderMessageEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class EmailListener implements ApplicationListener<OrderMessageEvent> {

    @Override
    @Async
    public void onApplicationEvent(OrderMessageEvent event) {
        System.out.println(Thread.currentThread().getName() + "开始发送邮件消息内容:" + event.getJsonObject().toJSONString());
    }
}
import com.demo.event.OrderMessageEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class SmsListener implements ApplicationListener<OrderMessageEvent> {

    @Override
    @Async
    public void onApplicationEvent(OrderMessageEvent event) {
        System.out.println(Thread.currentThread().getName() + "开始短信消息内容:" + event.getJsonObject().toJSONString());
    }
}

4)控制层

import com.alibaba.fastjson.JSONObject;
import com.demo.event.OrderMessageEvent;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class OrderController {

    @Resource
    private ApplicationContext applicationContext;

    @RequestMapping("/sendMsg")
    public String sendMsg() {
        //1.定义发送消息内容
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("email", "1209536385@qq.com");
        jsonObject.put("phone", "18159774275");
        jsonObject.put("text", "测试");
        OrderMessageEvent orderMessageEvent = new OrderMessageEvent(this, jsonObject);
        applicationContext.publishEvent(orderMessageEvent);
        return "success";
    }
}

5)启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class AppObServer {

    public static void main(String[] args) {
        SpringApplication.run(AppObServer.class);
    }
}

6)测试

http://localhost:8080/sendMsg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值