加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

玩转Java设计模式之观察者模式

发布时间:2023-04-26 13:35:06 所属栏目:教程 来源:
导读://抽象主题
@Data
public abstract class Subject {
//主题订阅者们
private List<Observer> observerList = Lists.newArrayList();
//订阅
public void register(Observer observer) {
//抽象主题
@Data
public abstract class Subject {
    //主题订阅者们
    private List<Observer> observerList = Lists.newArrayList();
    //订阅
    public void register(Observer observer) {
        observerList.add(observer);
    }
    //取消订阅
    public void remove(Observer observer) {
        observerList.remove(observer);
    }
    //发布东西
    public abstract void publish(String msg);
}
//抽象观察者
@Slf4j
@Data
@AllArgsConstructor
public abstract class Observer {
    //观察者名称
    private String name;
    //更新状态,由主题调度
    public void update(Object subject, Object args) {
        log.info("{}获取到变更通知:{}", name, args);
    }
}
//博客主题
@Slf4j
public class Blog extends Subject {
    @Override
    public void publish(String msg) {
        log.info("发布msg:{}", msg);
        //通知订阅者
        getobserverList().forEach(observer -> observer.update(this, msg));
    }
}
//普通用户观察者
@Slf4j
public class normalObserver extends Observer {
    public normalObserver(String name) {
        super(name);
    }
    @Override
    public void update(Object subject, Object args) {
        super.update(subject, args);
        log.info("{}获取到变更通知:普通用户可以不缓存", getName());
    }
}
//vip用户观察者
@Slf4j
public class VipObserver extends Observer {
    public VipObserver(String name) {
        super(name);
    }
    @Override
    public void update(Object subject, Object args) {
        super.update(subject, args);
        log.info("{}获取到变更通知:vip可以缓存", getName());
    }
}
@Slf4j
public class Application {
    public static void main(String[] args) {
        Blog blog = new Blog();
        VipObserver wang = new VipObserver("老王99");
        VipObserver lee = new VipObserver("老李");
        normalObserver four = new normalObserver("小四");
        normalObserver twoegg = new normalObserver("二蛋");
        log.info("---------------------begin--------------------");
        // 用户订阅博客,普通和vip用户
        new Thread(() -> {
            blog.register(wang);
            sleep(2);
            blog.register(lee);
            sleep(2);
            blog.register(four);
        }).start();
        // 博客线程每隔2秒发布一次文章,  总共发布4次
        new Thread(() -> {
            IntStream.rangeClosed(1, 4).forEach(i -> {
                blog.publish(String.format("新把戏第%s次", i));
                sleep(2);
            });
        }).start();
        // 有用户退出订阅博客,也有二蛋加入订阅
        new Thread(() -> {
            sleep(3);
            blog.remove(lee);
            sleep(2);
            blog.register(twoegg);
        }).start();
    }
    private static void sleep(int seconds) {
        try {
            TimeUnit.SECONDS.sleep(seconds);
        } catch (InterruptedException e) {
            log.error("error : ", e);
        }
    }
}
折腾Java设计模式之观察者模式

jdk内置的Obverser和Observable

@Slf4j
public class ObserverApplication {
    public static void main(String[] args) {
        log.info("Enter Text: ");
        EventSource eventSource = new EventSource();
        eventSource.addobserver((obj, arg) -> {
            log.info("Received response: {}", arg);
        });
        eventSource.addobserver((obj, arg) -> {
            log.info("Received response2: {},,{}", arg, obj
            );
        });
        new Thread(eventSource).start();
    }
}
class EventSource extends Observable implements Runnable {
    public void run() {
        while (true) {
            String response = new Scanner(system.in).next();
            setChanged();
            notifyObservers(response);
        }
    }
}

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章