上一篇我們學習了 觀察者模式。
觀察者和被觀察者接口都是我們自己定義的,整個設計模式我們從無到有都是自己設計的,其實,java已經內置了這個設計模式,我們只需要定義實現(xiàn)類即可。
下面我們不多說明,直接示例代碼,例子依然同 觀察者模式篇章,建議先去看看。
/**
* 被觀察者具體實現(xiàn), 實現(xiàn)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 {
/**
* 觀察者接收消息, 知道被觀察者發(fā)生了變化, 自己進行相應的處理, 這里只是測試打印日志而已
*
* @param o 主題, 被觀察者主題類型
* @param arg 接受到的消息
*/
@Override
public void update(Observable o, Object arg) {
if (o instanceof WeChatMessage) {
log.info("我是具體的觀察者之一:{}", this.getClass().getSimpleName());
log.info("被觀察者發(fā)生變化, 接收消息:{}", String.valueOf(arg));
}
}
}
/**
* 具體的觀察者2
*
* @author jiangkd
* @date 2023/7/28 10:09:22
*/
@Slf4j
@Component
public class User2 implements Observer {
/**
* 觀察者接收消息, 知道被觀察者發(fā)生了變化, 自己進行相應的處理, 這里只是測試打印日志而已
*
* @param o 主題, 被觀察者主題類型
* @param arg 接受到的消息
*/
@Override
public void update(Observable o, Object arg) {
if (o instanceof WeChatMessage) {
log.info("我是具體的觀察者之一:{}", this.getClass().getSimpleName());
log.info("被觀察者發(fā)生變化, 接收消息:{}", 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!!");
}
}
執(zhí)行結果記錄日志:
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 : 被觀察者發(fā)生變化, 接收消息:測試一下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 : 被觀察者發(fā)生變化, 接收消息:測試一下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("你過來一下");
}
}
執(zhí)行結果記錄日志:文章來源:http://www.zghlxwxcb.cn/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 : 被觀察者發(fā)生變化, 接收消息:在干什么
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 : 被觀察者發(fā)生變化, 接收消息:在干什么
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 : 被觀察者發(fā)生變化, 接收消息:你過來一下文章來源地址http://www.zghlxwxcb.cn/news/detail-616181.html
到了這里,關于java設計模式-觀察者模式(jdk內置)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!