你。。你在我身上装了监视器
2020-12-31 17:21
113 查看
引子,如图:
刘鹏经理在王芳姑娘身上安装了监视器,那么能不能在代码里给变量安装监视器呢?比如实现这样的功能:
int i = 100
watch(i, log(old, new) { print old, new}) 给变量I 安装一个监视器
i += 100 当i 变化时候,会调用log函数。
怎么实现呢?函数式语言貌似不倡导可变变量,那么用支持可变对象的Scala试试看吧。
我首先想到的就是 SET属性, 然后在属性里调用注册好的函数,代码如下:
/* 你。。你在我身上安装了监视器 代码版本 */ class Watch[T] (var value: T) { type F = (T, T) => Unit val dict = new scala.collection.mutable.HashMap[String, F]() def setValue(t: T) { for ((_,f1) <- dict) { f1(value, t) } value = t } def addWatch(k:String)(f:F) { dict(k) = f } def removeWatch(k:String){ dict.remove(k) } } object Watch { def apply[T](t: T) = new Watch(t) } object Hi { def main(args: Array[String]) { //声明一个watch变量 val w1 = new Watch("Hello") //添加一个监视器 w1.addWatch("key1") { (oldValue: String , newValue: String) => println(s"w1 Old Value: $oldValue => New Value: $newValue") } //通过setValue改变值 w1.setValue("123") var w2 = Watch(111111) w2.addWatch("key1") { (oldValue: Int , newValue: Int) => println(s"w2 Old Value: $oldValue => New Value: $newValue") } w2.setValue(2222222) //移除监视器 w2.removeWatch("key1") //下面的没有监视器了 w2.setValue(3333333) implicit def i2Watch(a: Int) = Watch(a) var i = 10; i.addWatch("key1"){ (oldValue: Int , newValue: Int) => println(s"w2 Old Value: $oldValue => New Value: $newValue") } //这里每次都会 重新 new 一个Watch,所以不起作用的 // i.setValue(100); } }
结果如下:
不知道还有没有更优雅的实现方式呢。
相关文章推荐
- windows性能监视器常用计数器
- 从乔布斯身上学到的8堂管理课
- [SQL Server]镜像监视器的使用和配置
- 安装Sql Server 2005失败 出现:性能监视器计数器要求 错误 没有下一步按钮
- NagstaMon--Nagios的桌面监视器
- [SQL Server优化]善用系统监视器,确定系统瓶颈
- 数以万计的资金从家长身上盘剥过来
- MemoryMonitor内存监视器
- 在Facebook身上找到的大数据灵感
- 那些坏女人身上的必杀技
- 通过网站统计或系统监视器查看IIS并发连接数
- SAP EWM 在仓库管理监视器中配置自定义功能按钮
- ImagePrinter是在Port监视器端的虚拟打印机
- 柳传志马云的用人之道:办公司就是办人,把钱存在员工身上
- 设计技巧7:装饰器 Decorator 动态地添加责任到对象身上,扩展类的行为比继承更灵活
- Automatic Database Diagnostic Monitor(自动数据库诊断监视器,ADDM)
- [转]根据性能监视器,分析性能瓶颈
- Firebug 网络监视器使用教程英文
- Swift编程语言学习10—— 枚举属性监视器
- 从Google身上可以学到的14个东西