发布-订阅模式:观察者就是一个监听者,类似监听器的存在,一旦被观察者/监听的目标发生的情况,就会被监听者发现,目标将情况发送到观察者
    观察者模式多用于实现订阅功能的场景

    1. /**
    2. * 观察者
    3. */
    4. public interface Observer {
    5. void update(String message, String name);
    6. }
    1. /**
    2. * 便衣人1
    3. */
    4. public class Civies1 implements Observer {
    5. @Override
    6. public void update(String message, String name) {
    7. System.out.println(name + "有情况" + message);
    8. }
    9. }
    10. /**
    11. * 便衣人2
    12. */
    13. public class Civies2 implements Observer {
    14. @Override
    15. public void update(String message, String name) {
    16. System.out.println(name + "有情况" + message);
    17. }
    18. }
    1. /**
    2. * 目标接口
    3. */
    4. public interface Target {
    5. void addObserver(Observer observer);
    6. void rmOberver(Observer observer);
    7. void notice(String message);
    8. }
    1. /**
    2. * 嫌犯1
    3. */
    4. public class Suspect1 implements Target {
    5. private String name = "嫌犯1";
    6. //观察者集合
    7. private List<Observer> list = new ArrayList<>();
    8. @Override
    9. public void addObserver(Observer observer) {
    10. if (!list.contains(observer)) {
    11. list.add(observer);
    12. }
    13. }
    14. @Override
    15. public void rmOberver(Observer observer) {
    16. if (list.contains(observer)) {
    17. list.remove(observer);
    18. }
    19. }
    20. @Override
    21. public void notice(String message) {
    22. list.forEach(observer -> observer.update(message, name));
    23. }
    24. }
    1. /**
    2. * 嫌犯2
    3. */
    4. public class Suspect2 implements Target {
    5. private String name = "嫌犯2";
    6. private List<Observer> list = new ArrayList<>();
    7. @Override
    8. public void addObserver(Observer observer) {
    9. if (!list.contains(observer)) {
    10. list.add(observer);
    11. }
    12. }
    13. @Override
    14. public void rmOberver(Observer observer) {
    15. if (list.contains(observer)) {
    16. list.remove(observer);
    17. }
    18. }
    19. @Override
    20. public void notice(String message) {
    21. list.forEach(item -> item.update(message, name));
    22. }
    23. }
    1. public class Clienter {
    2. public static void main(String[] args) {
    3. //定义2个嫌犯
    4. Suspect1 suspect1 = new Suspect1();
    5. Suspect2 suspect2 = new Suspect2();
    6. //定义2个便衣
    7. Observer civies1 = new Civies1();
    8. Observer civies2 = new Civies2();
    9. //增加嫌犯便衣观察
    10. suspect1.addObserver(civies1);
    11. suspect1.addObserver(civies2);
    12. suspect2.addObserver(civies1);
    13. suspect2.addObserver(civies2);
    14. //定义嫌犯的情况
    15. String message1 = "又卖了一批货";
    16. String message2 = "老大来视察了";
    17. suspect1.notice(message1);
    18. suspect2.notice(message2);
    19. }
    20. }