事件与委托C#到java

背景

我们已经确定了C#中的事件与委托类图,那我们能否按照当前的类图设计java版的事件与委托。图是如何进行对应的呢

方案

首先看我们已经根据大话设计模式的类图

C#事件与委托类图

在这里插入图片描述

java的事件与委托-------java监听器(现在监听器里边放两个壳,都在运行时传入)

在这里插入图片描述

版本1

在这里插入图片描述
看这个图是不是能和原来的图对应上了
在这里插入图片描述

在这里插入图片描述

版本2

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

扩展:

C# 的事件与委托

C# 是一种广泛用于构建应用程序的编程语言,它支持事件与委托机制,使得在程序中实现松耦合、可扩展的事件驱动编程变得更加容易和灵活。

委托(Delegate)
委托是一种引用类型,它可以用来引用一个或多个方法,并将这些方法视为单个实体。委托允许你将方法作为参数传递给其他方法,或者在需要的时候将其调用。这在实现回调函数、事件处理等方面非常有用。

以下是一个简单的委托示例:

csharp
Copy code
delegate int Calculate(int a, int b);

class Calculator {
    public int Add(int a, int b) {
        return a + b;
    }
    
    public int Subtract(int a, int b) {
        return a - b;
    }
}

class Program {
    static void Main(string[] args) {
        Calculator calculator = new Calculator();
        
        Calculate calc = calculator.Add;
        int result = calc(5, 3); // 调用 Add 方法,result = 8
        
        calc = calculator.Subtract;
        result = calc(10, 4); // 调用 Subtract 方法,result = 6
    }
}

事件(Event)

事件是 C# 中一种特殊的委托用法,它允许类提供通知其它类某种情况发生的能力,而不需要了解通知的类的详细信息。事件通常用于实现观察者模式,其中一个类(事件源)发出事件,其他类(事件订阅者)可以订阅这些事件并作出响应。

以下是一个简单的事件示例:

csharp
Copy code
class Button {
    public event EventHandler Clicked;
    
    public void Click() {
        Clicked?.Invoke(this, EventArgs.Empty);
    }
}

class Program {
    static void Main(string[] args) {
        Button button = new Button();
        button.Clicked += (sender, e) => Console.WriteLine("Button Clicked!");
        
        button.Click(); // 输出 "Button Clicked!"
    }
}

在这个示例中,Button 类声明了一个 Clicked 事件,它的类型是 EventHandler 委托,这是一个预定义的委托类型。订阅者通过 += 语法将方法添加到事件的委托链中,当按钮被点击时,订阅的方法会被调用。

综上所述,C# 的委托和事件机制提供了一种灵活的方式来实现回调、事件驱动编程以及观察者模式。通过委托,方法可以作为参数传递,从而实现高度的灵活性。事件则使得对象之间能够通过松耦合的方式进行通信,增强了程序的可扩展性和可维护性。

Java 的事件与委托

Java 是一种跨平台的编程语言,虽然它没有像 C# 那样直接的委托和事件机制,但是通过接口和匿名内部类,也能够实现类似的事件驱动和回调机制。

接口与回调

在 Java 中,你可以使用接口来定义一个约定,然后通过实现该接口的类来提供具体实现。这可以看作是一种回调机制,其中一个类通过传递自身的实例给另一个类,使得后者能够在需要时调用前者的方法。

以下是一个简单的接口和回调示例:

java
Copy code
interface Calculator {
    int calculate(int a, int b);
}

class Adder implements Calculator {
    
    public int calculate(int a, int b) {
        return a + b;
    }
}

class Subtractor implements Calculator {
    
    public int calculate(int a, int b) {
        return a - b;
    }
}

public class CallbackExample {
    public static void main(String[] args) {
        Calculator calculator = new Adder();
        int result = calculator.calculate(5, 3); // result = 8
        
        calculator = new Subtractor();
        result = calculator.calculate(10, 4); // result = 6
    }
}

匿名内部类与事件

虽然 Java 没有像 C# 那样直接的事件和委托,但你可以使用匿名内部类来实现类似的效果。在 Java 中,匿名内部类允许你在定义对象的同时实现接口或继承类,从而以简洁的方式实现回调和事件处理。

以下是一个使用匿名内部类实现事件处理的示例:

java
Copy code
import java.awt.*;
import java.awt.event.*;

public class EventListenerExample {
    public static void main(String[] args) {
        Frame frame = new Frame("Listener Example");
        Button button = new Button("Click Me");
        
        button.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                System.out.println("Button Clicked!");
            }
        });
        
        frame.add(button);
        frame.setSize(300, 200);
        frame.setLayout(new FlowLayout());
        frame.setVisible(true);
    }
}

在这个示例中,我们使用了匿名内部类来实现了 ActionListener 接口,并在内部类的 actionPerformed 方法中定义了按钮点击事件的处理。当按钮被点击时,匿名内部类的方法会被调用。

尽管 Java 的事件和委托机制不如 C# 那样直接,但通过接口、匿名内部类以及设计模式,你仍然能够实现类似的事件驱动和回调功能。这些机制允许 Java 程序在事件发生时执行特定操作,实现了一种松耦合的编程方式。

总结起来,C# 和 Java 都支持事件与委托机制,尽管在实现方式和语法上有一些差异,但其本质都是为了实现事件驱动编程和回调机制,以增强程序的灵活性和可维护性。

总结

在 C# 中,委托是一种引用类型,允许引用一个或多个方法,并将其视为单个实体。委托在实现回调和方法作为参数传递方面非常强大,同时也为事件的实现提供了基础。事件是一种特殊的委托用法,使得类可以提供通知其他类某种情况发生的能力,而不需要暴露过多的内部细节。这在实现观察者模式、事件驱动编程等方面非常有用。

在 Java 中,虽然没有直接的委托和事件机制,但通过接口和匿名内部类,仍然可以实现类似的功能。接口和匿名内部类提供了一种松耦合的方式来实现回调和事件驱动机制,虽然语法上略显繁琐,但同样能够达到灵活性和可扩展性的目标。

无论是 C# 还是 Java,事件与委托的概念都是为了在程序中实现松耦合、可扩展的设计,使得代码更容易维护和扩展。无论你选择哪一种语言,掌握事件与委托的机制都会对你的编程技能和项目开发产生积极影响,帮助你构建更具弹性和可维护性的应用程序。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

balance…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值