• 观察者模式


    观察者模式,应以一种一对多的依赖关系,当状态改变,自动通知其他依赖的对象。也就是发布订阅模式。

    具体实现包括四个部分:

    • 抽象被观察者;
    • 被观察者角色;
    • 抽象观察者;
    • 观察者角色。

    创建抽象观察者:

    1 public interface Observer {
    2 
    3     void update(String msg);
    4 
    5     String getName();
    6 }

    创建抽象被观察者:

    1 public interface Subject {
    2 
    3     void attach(Observer observer);
    4 
    5     void detach(Observer Observer);
    6 
    7     void notifyObservers(String msg);
    8 }

    创建两个观察者:

     1 public class LancerObserver implements Observer {
     2 
     3     private String name;
     4 
     5     public LancerObserver(String name) {
     6         this.name = name;
     7     }
     8 
     9     @Override
    10     public String getName() {
    11         return name;
    12     }
    13 
    14     @Override
    15     public void update(String msg) {
    16         System.out.println(name + " got msg " + msg);
    17     }
    18 }
    19 
    20 public class SaberObserver implements Observer {
    21 
    22     private String name;
    23 
    24     public SaberObserver(String name) {
    25         this.name = name;
    26     }
    27 
    28     @Override
    29     public void update(String msg) {
    30         System.out.println(name + " got msg " + msg);
    31     }
    32 
    33     @Override
    34     public String getName() {
    35         return name;
    36     }
    37 }

    创建被观察者:

     1 public class SanGrealSubject implements Subject {
     2 
     3     List<Observer> observers = new ArrayList<>(10);
     4 
     5     @Override
     6     public void attach(Observer observer) {
     7         observers.add(observer);
     8     }
     9 
    10     @Override
    11     public void detach(Observer target) {
    12         observers.removeIf(observer -> StringUtils.equalsIgnoreCase(observer.getName(), target.getName()));
    13     }
    14 
    15     @Override
    16     public void notifyObservers(String msg) {
    17         for (Observer observer : observers) {
    18             observer.update(msg);
    19         }
    20     }
    21 }

    创建测试方法:

     1 public class Main {
     2 
     3     public static void main(String[] args) {
     4         Subject subject = new SanGrealSubject();
     5 
     6         Observer saber = new SaberObserver("Arthur");
     7         Observer lancer = new LancerObserver("CuChulainn");
     8 
     9         subject.attach(saber);
    10         subject.attach(lancer);
    11         subject.notifyObservers("i am CuChulainn");
    12 
    13         subject.detach(lancer);
    14         subject.notifyObservers("why");
    15     }
    16 }
  • 相关阅读:
    NX二次开发-UFUN获取系统相关信息UF_ask_system_info
    NX二次开发-UFUN设置环境变量UF_set_variable
    NX二次开发-UFUN获取环境变量路径,将环境变量转换为字符串,字符串拼接UF_translate_variable
    NX二次开发-UFUN终止UF_terminate
    NX二次开发-UFUN计时函数UF_begin_timer
    NX二次开发-获取WCS标识UF_CSYS_ask_wcs
    NX二次开发-UFUN将工程图转成CGM和PDF文件UF_CGM_export_cgm
    require.js简单入门
    【转】JS中的call()和apply()方法
    C# Enum枚举类型操作扩展类
  • 原文地址:https://www.cnblogs.com/avalon-merlin/p/10516292.html
Copyright © 2020-2023  润新知