不知道為什么,那么多設(shè)計模式里面,對代理模式有一種特別的喜歡。很是喜歡這種切面的思維,將多個相似方法的共同前置和后置抽象出來的實現(xiàn),真的是覺得很棒。這半年轉(zhuǎn)golang開發(fā)之后,終于在前段時間折騰出了golang風格的代理模式--其實已經(jīng)不是代理模式了,更貼切的說法應(yīng)該叫Golang的小技巧之一
沒有對比就沒有差距的體現(xiàn),用go和Java實現(xiàn)一個插入新用戶的demo
Java風格
先看下在Java里面的實現(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實體類:
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é)果:
Java的實現(xiàn)
代碼就不分析了,代理模式在之前的文章有提到,這里有傳送門
Golang風格
Golang因為有一個函數(shù)變量形參的特性,注定了要實現(xiàn)類似代理模式這種抽象前置和后置動作的操作,不需要那么繁雜
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ù)")
}
是的,你沒看錯,go要實現(xiàn)這種切面的動作,也就那么幾行代碼,然后來看下測試結(jié)果
精簡但不失力量的go實現(xiàn)
后記:各個語言有各個語言的特性,一種語言的某個算法實現(xiàn),換成另一種語言,也有可能,要換一個思路實現(xiàn),不應(yīng)該只得其形。