不知道為什么举瑰,那么多設(shè)計(jì)模式里面四濒,對代理模式有一種特別的喜歡。很是喜歡這種切面的思維,將多個(gè)相似方法的共同前置和后置抽象出來的實(shí)現(xiàn)欠气,真的是覺得很棒厅各。這半年轉(zhuǎn)golang開發(fā)之后,終于在前段時(shí)間折騰出了golang風(fēng)格的代理模式--其實(shí)已經(jīng)不是代理模式了,更貼切的說法應(yīng)該叫Golang的小技巧之一
沒有對比就沒有差距的體現(xiàn)晃琳,用go和Java實(shí)現(xiàn)一個(gè)插入新用戶的demo
Java風(fēng)格
先看下在Java里面的實(shí)現(xiàn)
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("--------開啟事務(wù)--------");
userService.save(user);
System.out.println("--------結(jié)束事務(wù)--------");
}
}
UserServiceImpl業(yè)務(wù)類:
public class UserServiceImpl implements UserService {
@Override
public void save(User user) {
System.out.println("保存用戶"+user);
}
}
User實(shí)體類:
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"));
}
}
結(jié)果:
代碼就不分析了讯检,代理模式在之前的文章有提到,這里有傳送門
Golang風(fēng)格
Golang因?yàn)橛幸粋€(gè)函數(shù)變量形參的特性卫旱,注定了要實(shí)現(xiàn)類似代理模式這種抽象前置和后置動(dòng)作的操作人灼,不需要那么繁雜
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("開啟事務(wù)")
fn()
fmt.Println("結(jié)束事務(wù)")
}
是的,你沒看錯(cuò)顾翼,go要實(shí)現(xiàn)這種切面的動(dòng)作投放,也就那么幾行代碼,然后來看下測試結(jié)果
后記:各個(gè)語言有各個(gè)語言的特性适贸,一種語言的某個(gè)算法實(shí)現(xiàn)灸芳,換成另一種語言,也有可能拜姿,要換一個(gè)思路實(shí)現(xiàn)烙样,不應(yīng)該只得其形。