上一篇我们学习了 观察者模式。
观察者和被观察者接口都是我们自己定义的,整个设计模式我们从无到有都是自己设计的,其实,java已经内置了这个设计模式,我们只需要定义实现类即可。
下面我们不多说明,直接示例代码,例子依然同 观察者模式篇章,建议先去看看。
/**
* 被观察者具体实现, 实现jdk自带的类
*
* @author jiangkd
* @date 2023/7/28 10:32:03
*/
@Component
public class WeChatMessage extends Observable {
private String message;
/**
* 模拟被观察者的主题更新, 通知所有观察者
*
* @param message 主题更新
*/
public void updateMessage(String message) {
this.message = message;
// 通知所有观察者
this.setChanged();
this.notifyObservers(message);
}
}
两个观察者
/**
* 具体的观察者1
*
* @author jiangkd
* @date 2023/7/28 10:07:34
*/
@Slf4j
@Component
public class User1 implements Observer {
/**
* 观察者接收消息, 知道被观察者发生了变化, 自己进行相应的处理, 这里只是测试打印日志而已
*
* @param o 主题, 被观察者主题类型
* @param arg 接受到的消息
*/
@Override
public void update(Observable o, Object arg) {
if (o instanceof WeChatMessage) {
log.info("我是具体的观察者之一:{}", this.getClass().getSimpleName());
log.info("被观察者发生变化, 接收消息:{}", String.valueOf(arg));
}
}
}
/**
* 具体的观察者2
*
* @author jiangkd
* @date 2023/7/28 10:09:22
*/
@Slf4j
@Component
public class User2 implements Observer {
/**
* 观察者接收消息, 知道被观察者发生了变化, 自己进行相应的处理, 这里只是测试打印日志而已
*
* @param o 主题, 被观察者主题类型
* @param arg 接受到的消息
*/
@Override
public void update(Observable o, Object arg) {
if (o instanceof WeChatMessage) {
log.info("我是具体的观察者之一:{}", this.getClass().getSimpleName());
log.info("被观察者发生变化, 接收消息:{}", String.valueOf(arg));
}
}
}
测试:
/**
* @author jiangkd
* @date 2023/7/28 10:37:36
*/
@SpringBootTest(classes = DemoApplication.class)
@RunWith(SpringRunner.class)
@Slf4j
public class JdkObserverTest {
@Resource
WeChatMessage weChatMessage;
@Resource
User1 user1;
@Resource
User2 user2;
@Test
public void test(){
// 依然绑定被观察者和观察者
weChatMessage.addObserver(user1);
weChatMessage.addObserver(user2);
weChatMessage.updateMessage("测试一下1!!");
}
}
执行结果记录日志:
2023-07-28 10:47:30.713 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 我是具体的观察者之一:User2
2023-07-28 10:47:30.714 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 被观察者发生变化, 接收消息:测试一下1!!
2023-07-28 10:47:30.714 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 我是具体的观察者之一:User1
2023-07-28 10:47:30.714 INFO 23796 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 被观察者发生变化, 接收消息:测试一下1!!
然后测试注销其中一个观察者User1
@SpringBootTest(classes = DemoApplication.class)
@RunWith(SpringRunner.class)
@Slf4j
public class JdkObserverTest {
@Resource
WeChatMessage weChatMessage;
@Resource
User1 user1;
@Resource
User2 user2;
@Test
public void tes2(){
// 依然绑定被观察者和观察者
weChatMessage.addObserver(user1);
weChatMessage.addObserver(user2);
weChatMessage.updateMessage("在干什么");
log.info("========================================");
weChatMessage.deleteObserver(user1);
weChatMessage.updateMessage("你过来一下");
}
}
执行结果记录日志:文章来源:https://www.toymoban.com/news/detail-616181.html
2023-07-28 10:48:38.946 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 我是具体的观察者之一:User2
2023-07-28 10:48:38.947 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 被观察者发生变化, 接收消息:在干什么
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 我是具体的观察者之一:User1
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User1 : 被观察者发生变化, 接收消息:在干什么
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.d.gczms.JdkObserverTest : ========================================
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 我是具体的观察者之一:User2
2023-07-28 10:48:38.948 INFO 17928 — [ main] d.b.e.design_patterns.gczms.jdk.User2 : 被观察者发生变化, 接收消息:你过来一下文章来源地址https://www.toymoban.com/news/detail-616181.html
到了这里,关于java设计模式-观察者模式(jdk内置)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!