分享
  1. 首页
  2. 文章

在Golang进化的代理模式

l_sivan · · 4044 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

不知道为什么,那么多设计模式里面,对代理模式有一种特别的喜欢。很是喜欢这种切面的思维,将多个相似方法的共同前置和后置抽象出来的实现,真的是觉得很棒。这半年转golang开发之后,终于在前段时间折腾出了golang风格的代理模式--其实已经不是代理模式了,更贴切的说法应该叫Golang的小技巧之一

没有对比就没有差距的体现,用go和Java实现一个插入新用户的demo

Java风格

先看下在Java里面的实现

UserService接口:
public interface UserService { 
 void save(User user);
}
UserServiceProxy代理类:
public class UserServiceProxy implements UserService{
 private UserService userService;
 public UserServiceProxy(UserService userService) {
 super();
 this.userService = userService;
 }
 @Override
 public void save(User user) {
 System.out.println("--------开启事务--------");
 userService.save(user);
 System.out.println("--------结束事务--------");
 }
}
UserServiceImpl业务类:
public class UserServiceImpl implements UserService {
 @Override
 public void save(User user) {
 System.out.println("保存用户"+user);
 }
}
User实体类:
public class User {
 private String name;
 public User(String name) {
 this.name = name;
 }
 @Override
 public String toString() {
 StringBuilder builder = new StringBuilder();
 builder.append("User [name=").append(name).append("]");
 return builder.toString();
 }
}
测试类:
public class Main {
 public static void main(String[] args) {
 UserServiceProxy proxy = new UserServiceProxy(new UserServiceImpl());
 proxy.save(new User("sivan"));
 }
}

结果:

Java的实现
Java的实现

代码就不分析了,代理模式在之前的文章有提到,这里有传送门

Golang风格

Golang因为有一个函数变量形参的特性,注定了要实现类似代理模式这种抽象前置和后置动作的操作,不需要那么繁杂

package main
import (
 "fmt"
)
func main() {
 saveUser(&user{"sivan"})
}
type user struct {
 Name string
}
func (u *user) String() string {
 return u.Name
}
func saveUser(user *user) {
 withTx(func() {
 fmt.Printf("保存用户 %s\n", user.Name)
 })
}
func withTx(fn func()) {
 fmt.Println("开启事务")
 fn()
 fmt.Println("结束事务")
}

是的,你没看错,go要实现这种切面的动作,也就那么几行代码,然后来看下测试结果

精简但不失力量的go实现
精简但不失力量的go实现

后记:各个语言有各个语言的特性,一种语言的某个算法实现,换成另一种语言,也有可能,要换一个思路实现,不应该只得其形。

实力不足,难免有错,还请评论区指正。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:l_sivan

查看原文:在Golang进化的代理模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
4044 次点击
1 回复 | 直到 2017年10月27日 07:03:48
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏