`
aiwori
  • 浏览: 8751 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

有一种设计模式叫回调

 
阅读更多

一、回调是一种常见的程序设计模式。在这种模式中,可以指出某个特定事件发生时应该采取的动作。例如,可以指出在按下鼠标或选择某个菜单项时应该采取什么行动。
1.在C#中,我们会定义一个委托用来传递回调函数,请看下面代码,在A类里面调用B类的ShowAssociateRuleView的方法时传递了一个匿名委托(即回调函数),
在ShowAssociateRuleView方法中触发了传过来的onComplete,即回调了A传过来的匿名委托。
Class A
{
/// <summary>
/// 查看二级关联授权情况
/// </summary>
/// <param name="sender">sender</param>
/// <param name="e">RoutedEventArgs</param>
private void btnSeeSencondAssociate_Click(object sender, RoutedEventArgs e)
{
B bclass=new B();
//这里调用B类的ShowAssociateRuleView方法,并将匿名委托作为参数传过去
bclass.ShowAssociateRuleView(delegate
{
DataCenterSwitchService.Instance.RevertContext();
});
}
}

Class B
{
/// <summary>
/// 弹出“一二级关联设置”自定义分组规则界面.
/// </summary>
/// <param name="onComplete">onComplete</param>
public void ShowAssociateRuleView(Action onComplete)
{
Dialogs.ShowModelDialog(
this,
"查看关联情况",
delegate(object sender, WindowClosedEventArgs e)
{
//这里触发回调方法
if (onComplete != null)
{
onComplete();
}
},
null,
new Size(950, 600));
}
}

2.在java中如何实现回调呢?在java中可以利用接口来传递回调方法,其实有时候我们可以把C#中的委托比作只有一个方法的接口。
举例:上级经理张三分配开发任务给李四,李四写完代码后要通知上级代码检查。显然,张三不一定要一直看着李四直到代码写完,在李四写代码的过程中可以干其他事情。
代码如下:
先约定一个接口
public interface ICallBack {
void execute();
}

上级张三类:
public class Zhangsan {
private void CallLisi() throws InterruptedException {
Lisi lisi=new Lisi();
//上级张三下发任务给李四
//这里传递了一个实现了ICallBack接口的匿名类给Lisi类的coding方法
lisi.coding(new ICallBack() {
@Override
public void execute() {
System.out.println("张三正在检查李四的代码。。");
}
});
}
}

下级李四类:
public class Lisi {
//接收任务
public void coding(ICallBack onComplete) throws InterruptedException {
System.out.println("李四正在写代码。。。");
Thread.sleep(5000);
System.out.println("李四写完代码了。。。");
//这里回调,通知老大张三
onComplete.execute();
}
}


二、延伸
1.上例中如果存在王五类(配置部人员),代码如下:
public class Wangwu {
//李四写完代码后配置部王五要合并代码
private void CallLisi() throws InterruptedException {
Lisi lisi=new Lisi();
lisi.coding(new ICallBack() {
@Override
public void execute() {
System.out.println("配置部王五在合并李四写的代码。。");
}
});
}
}

这里Zhangsan类和Wangwu类在李四写完代码后干的活儿都不同,那么我们就可以写两个实现了ICallBack接口的类传给Lisi.coding方法,是不是符合了分离变化点的原则。
在用Java写JDBC代码的时候,通常我们会把作映射的一部分抽取出来,由调用方去实现,这就分离了变化点。如下代码,通常我们的变化部分就在做实体映射部分,我们就需要提取一个接口
由调用方来实现。

public List<User> query() {

List<User> userList = new ArrayList<User>();
String sql = "select * from User";

Connection con = null;
PreparedStatement pst = null;
ResultSet rs = null;
try {
con = HsqldbUtil.getConnection();
pst = con.prepareStatement(sql);
rs = pst.executeQuery();

User user = null;
while (rs.next()) {

user = new User();
user.setId(rs.getInt("id"));
user.setUserName(rs.getString("user_name"));
user.setBirth(rs.getDate("birth"));
user.setCreateDate(rs.getDate("create_date"));
userList.add(user);
}


} catch (SQLException e) {
e.printStackTrace();
}finally{
//关闭数据库连接部分。。。。。
}
return userList;
}

2.在上面的例子中用到了匿名类,格式如new ICallBack(){} 或new 抽象类如new MouseAdapter(){},通常在不需要重用并且代码行数很少情况下,可以使用匿名类方式。


个人拙见,请勿拍砖,指正点评即可,o(∩_∩)o...

分享到:
评论

相关推荐

    设计模式Callback介绍与实例

    回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。 java回调机制: 软件模块之间总是存在着一定的接口,从调用方式上,...

    详解Android中接口回调、方法回调

    在Android开发中我们很多地方都用到了方法的回调,回调就是把方法的定义和功能导入实现分开的一种机制,目的是为了解耦他的本质是基于观察者设计模式,即观察者设计模式的的简化版,例如:在下载时候的进度回调,在...

    一款适配ios黑暗模式的demo,通过一键监听回调的方式来适配.zip

    一款适配ios黑暗模式的demo,通过一键监听回调的方式来适配,只需要在回调中一次性编写适配代码即可,更新时,会自动回调所有适配代码,避免了走系统的那些方法和判断 软件开发设计:PHP、QT、应用软件开发、系统...

    详解Observer Pattern(观察者模式)在Java中的使用原理

    对于C#的委托、代理概念所使用的Callback(回调模式--参见本人的“第一个C#程序Hello World ”资源)来看,Java Swing编程是纯粹的OO语言、是一种非常优雅的编程语言(本人认为)--而C#的学习好像非常强调所谓的OO思想...

    Android异步回调中的UI同步性问题分析

    常常设计到不同线程之间的通信,如下载图片完成后通知 UI线程更新UI,凡此类场景,无论使用哪一种具体的线程间通信方式(Handler/Message、Handler/post、基于接口的回调、基于多对多的观察者模式如EventBus等),其...

    Windows驱动程序设计入门

    Windows驱动程序是一种位于内核地址空间并且 工作于内核模式的一种特殊的程序类型(.sys文件)。 驱动程序是操作系统信任的一个内核扩展模块。 驱动程序和操作系统之间遵循的是容器与插件模型。OS负责管理Driver的生命...

    学习JavaScript设计模式之观察者模式

    (1)可广泛应用于异步编程中,是一种替代传递回调函数的方案。 (2)可取代对象之间硬编码的通知机制,一个对象不用再显示地调用另外一个对象的某个接口。两对象轻松解耦。 二、DOM事件–观察者模式典例 需要...

    Javascript设计模式之观察者模式的多个实现版本实例

    观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。...

    chimera-patterns:Chimera模式是javascriptECMA6的一个应用设计模式库,其中包含在javascript编码中发现或有用的通用模式的通用版本。

    Chimera模式是javascript / ECMA6的一种应用的设计模式库,其中包含在javascript编码中发现或有用的通用模式的通用版本。 当前的命名空间功能 Mutlicast 多播命名空间包含可用于创建事件和功能的可执行回调列表的类...

    遥控式触摸调光IC触摸遥控调光芯片资料

    SJT0804是专为LED照明产品设计的一款遥控式触摸调光IC、触摸遥控调光器,用于单键触摸调光照明灯饰;提供SOP-8小体积封装,可自由设置触摸调光按键的灵敏度;提供触摸调光和遥控调光两种模式;渐亮渐暗功能,SJT0804...

    Practice-MVP:MVP设计模式的实践

    前段时间做项目时有用到一个比较常用的设计模式-MVP模式,我个人比较喜欢有优美的结构的代码,我始终相信代码也是一种艺术,现在就特地将这一部分拿出来分享哈,自己也可以再熟悉熟悉。 OK,废话不多说先上个图,来...

    asp.net知识库

    .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN文章 —— 泛型FAQ:最佳实践 Visual C# 3.0 新特性概览 C# 2.0会给我们带来什么 泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 ...

    C++从0实现百万并发Reactor服务器完结13章下载

    reactor是一种设计模式, 是服务器的重要模型, 是一种事件驱动的反应堆模式, 高效的事件处理模型。 reactor 反应堆: 事件来了才执行,事件类型可能不尽相同,所以我们需要提前注册好不同的事件处理函数。事件到来就...

    PHP实现单例模式建立数据库连接的方法分析

    wiki百科:单例模式,也叫单子模式,是一种常用的软件设计模式。 在应用这个模式时,单例对象的类必须保证只有一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 二、...

    Laravel学习教程之IOC容器的介绍与用例

    依赖注入(也是一种设计模式,一般用于实现IoC)是一个不用编写固定代码来处理类之间依赖的方法,相反的,这些依赖是在运行时注入的,这样允许处理依赖时具有更大的灵活性。 理解 Laravel IoC容器是构建强大应用程序...

    Android 适配器模式应用及设计原理

    适配器模式是一种重要的设计模式,在 Android 中得到了广泛的应用。适配器类似于现实世界里面的插头,通过适配器,我们可以将分属于不同类的两种不同类型的数据整合起来,而不必去根据某一需要增加或者修改类里面的...

    C++实现delegate

    用C++做项目的时候,尤其是写客户端的时候经常会有事件回调的设计,一般的方式是使用虚函数表,用一个虚基类包含一系列的回调函数。但这种方式和C++11的lamda不兼容,为了更方便的实现事件回调机制,使用delegate是...

    JdbcTemplate完全学习

    SpringJDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式。JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做...

Global site tag (gtag.js) - Google Analytics