同步、异步、回调及观察者模式

1、同步调用

同步调用是最基本的调用方式,即类 A 的方法 a() 调用类 B 的方法 b(),一直等待方法 b() 执行结束,方法 a() 才继续往下走。这是一种阻塞调用, 适用于方法 b() 执行时间不长的情况,如果方法 b() 执行时间过长或者直接阻塞的话,方法 a() 的余下代码是无法执行下去的。


2、异步调用

异步调用是为了解决同步调用存在阻塞情况而产生的一种调用方式。类 A 的方法 a() 通过创建新线程的方式调用类 B 的方法 b(),代码接着直接往下执行。这样方法 b() 在新线程中执行,就不会阻塞方法 a() 的执行。对于方法 a() 无需方法 b() 的返回结果,可以直接往下执行其他操作。对于需要方法 b() 的返回结果,通常可以借助回调机制实现。

3、回调

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

public interface MyOnClickListener {

    // 回调函数

    public void onClick(); 

}

public class MyButton {

    MyOnClickListener listener;

    public void setOnClickListener(MyOnClickListener listener) {

        this.listener = listener;

    }


    /*

    * 按钮被点击

    */

    public void click() {

        listener.onClick();

    }

}

public class Client {


    public static void main(String[] args) {

        MyButton button = new MyButton(); 


        // 注册监听器

        button.setOnClickListener(new MyOnClickListener() {


            @Override

            public void onClick() {

                System.out.println("按钮被点击了"); 

            }

        });


        // 用户点击按钮

        button.click();

    } 

}

4、观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

public interface Observer {

    public void update();

}

public class Subject {

    List<Observer> lists = new ArrayList<Observer>();

    public void register(Observer observer) {

        lists.add(observer);

    }

    public void notifyObservers() {

        for(Observer observer : lists) {

            observer.update();

        }

    }


    public void unRegister(Observer observer) {

        lists.remove(observer);

    }

}


public class Client {

    public static void main(String[] args) {

        Subject subject = new Subject();

        subject.register(new Observer() {

            @Override

            public void update() {

                System.out.println("onserver 1 update");

            }

        });

        subject.register(new Observer() {

            @Override

            public void update() {

                System.out.println("observer 2 update");

            }

        });

        subject.notifyObservers();

    }

}

参考:https://www.jianshu.com/p/2615a4acb9ac

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于...
    JxMY阅读 1,027评论 1 3
  • 设计模式分类 总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原...
    lifeline丿毅阅读 1,347评论 0 2
  • alert(a); function name(parameters) { alert(parameters); ...
    name阿喆azhe阅读 1,343评论 0 3
  • 何时使用观察者模式 1、触发联动:当修改目标状态时就会触发相应的通知,然后会循环调用所有注册的观察者对象的相应方法...
    哥哥是欧巴Vitory阅读 398评论 0 0
  • 温度,原则上是表示物体冷热程度的物理量,换言之温度只能通过物体随温度变化的某些特性来间接测量。 可是今天这个温度是...
    小鹿故事集阅读 260评论 0 0

友情链接更多精彩内容