委托的设计思想

委托的设计思想

上一文中,我们简单的了解了一下,委托的机制,那么本文我们来了解一下委托的设计思想。

Overview

我想你已经体验到了委托带来的好处,试想一下,这么好用的东西,其他编程语言中肯定也有类似的东西,毕竟天下文章一大抄..呃 口胡。如果你是有过Android开发经验的,我想你肯定对Android中各种各样的Listener十分深刻,Android中的Listener就是一种类似我们C#委托的东西,在Java中被称为 回调函数

Java的回调机制

Java 中的回调机制,是通过传递接口来实现的,下面我们来看一看。设想下面的这么一种情况: 有一个Person类 ,其中有一个方法叫做introduce 方法,来介绍自己,当介绍完成之后,执行一个方法来告诉系统已经介绍完毕。

建立一个用来通知系统,Person已经介绍完毕的接口。

public interface IntroducedCallBack {
    void Introduced(Person person);
}

Person类

import javax.annotation.processing.SupportedSourceVersion;

public class Person {
    private String name;

    private int age;

    private String gender;

  public Person(String name, int age, String gender) {
        super();
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }

    
    /**
     * 该person 介绍自己的方法
     * @param callBack 当介绍完自己后的回调方法
     * */
    public void introduce(IntroducedCallBack callBack) {
        System.out.println("My name is " + this.name + "I am " + age + "years old. I my a " + gender);
        if (callBack != null)
            callBack.Introduced(this);
    }
}

进行调用

public class Program {
    public static void main(String[] args) {
        Person person = new Person("鲁迅认识的那只猹", 18, "Male");
        person.introduce(new IntroducedCallBack() {
            @Override
            public void Introduced(Person person) {
                System.out.println("好的!"+person.getName() +" 系统收到了你的介绍!");
            }
        });
    }
}

最后的输出结果为

My name is 鲁迅认识的那只猹I am 18years old. I my a Male
好的!鲁迅认识的那只猹系统受到了你的介绍!

分析

我们在 person 调用 introduce 方法的时候,传递了我们的实例化后的接口,在这里通过接口的方式完成了类似C#委托机制的功能 Person 类 调用了 Program类的方法 。可能你并没有学过Java但是我想上面的代码同样可以被轻易的理解,毕竟这两个语言是非常相似的。

结语

如果你学过设计模式,我想是你一定在上面的代码中看到了 发布-订阅 设计模式的影子,可能在这里并不是很明显,毕竟这个例子的代码太少了。 C#中委托的设计借鉴了发布订阅模式的思想,在C#没有委托之前,我们实现 发布-订阅 设计模式的时候,也是通过接口来实现的,但是有了委托之后,C#可以通过多播委托来实现发布订阅设计模式。关于多播委托下文会有详细的介绍。

原文地址:https://www.cnblogs.com/slyfox/p/7511929.html