1、一个接口,对于不同情况的key,要执行的函数太多,不用if-else,
可以用字典。
type GetShareInfoHandler func(l *ShareInfoLogic, baseReq BaseReq, resp *sharedata.ShareData) (err error)
var shareInfoHandlers = map[string]GetShareInfoHandler{
jobDetailKey: jobDetail, // 招工详情
inviteForGetBeanKey: inviteForGetBean, // 邀请赚开工豆(悬浮按钮)
otherWorkerCardKey: otherWorkerCard, // 他人的找活名片-分享
myWorkerCardKey: myWorkerCard, // 发布找活-我的找活名片-预览/分享-分享
wxAddGroupMemberKey: wxAddGroupMember, // 添加班组成员-微信添加-分享给微信好友
onekeyCheckworkKey: onekeyCheckwork, // 考勤表-一键对工
wxCheckworkKey: wxCheckwork, // 考勤表-微信对工
notepadDetailKey: notepadDetail, // 记事本-信息详情-分享
transferResultAlipayKey: transferResultAlipay, // 转账结果-分享-支付宝
transferResultMYbankKey: transferResultMYbank, // 转账结果-分享-网商银行
transferInviteUserOpenActivityKey: transferInviteUserOpenActivity, // 【活动中】给工人转账-邀请开通(被邀请工人已注册吉工家)
livingCostInviteOpenActivityKey: livingCostInviteOpenActivity, // 【活动中】网商生活费活动页-邀请工友开户
livingCostInviteOpenKey: livingCostInviteOpen, // 【非活动】网商生活费主页-邀请开户
transferInviteUserOpenKey: transferInviteUserOpen, // 【非活动】给工人转账-邀请开通(被邀请工人已注册吉工家)
plusAddFriendQrCodeKey: plusAddFriendQrCode, // 右上角加号-添加朋友-我的吉工家二维码
meProfileQrCodeKey: meProfileQrCode, // 1.消息-个人头像-我的资料-更多-我的个人资料-我的吉工家二维码2.我-个人资料-我的吉工家二维码
groupNotifyDetailKey: groupNotifyDetail, // 班组-通知详情
groupQualityDetailKey: groupQualityDetail, // 班组-质量详情(问题详情)
groupSecurityDetailKey: groupSecurityDetail, // 班组-安全详情(问题详情)
groupLogDetailKey: groupLogDetail, // 班组-日志详情(通用日志详情)
inviteWorkerJoinGroupKey: inviteWorkerJoinGroup, // 邀请工友进群(悬浮按钮)
myJobKey: myJob, // 置顶后回到我发布的招工页面触发
meIntegralExchangeGainKey: meIntegralExchangeGain, // 我-我的积分-积分兑换模块点赚取积分
meAboutNewsDetailKey: meAboutNewsDetail, // 我-关于吉工家-新闻资讯-新闻详情
meSignupInviteKey: meSignupInvite, // 我-每日一签-去邀请
meGainBeanInviteKey: meGainBeanInvite, // 我-获取开工豆-去邀请
todayRecommendJobKey: todayRecommendJob, // 今日推荐分享方法
meMomentsArticleKey: meMomentsArticle, // 我-工友圈-正文-分享
meJobShareToGroupKey: meJobShareToGroup, // 我-我的招工-分享到群按钮
atlasListKey: atlasList, // 吉工之家列表页-右上角-分享
atlasDetailPosterKey: atlasDetailPoster, // 吉工之家图片详情页-分享海报
atlasDetailKey: atlasDetail, // 吉工之家图片详情页-右上角-分享
activity220501Key: activity220501, // 五一活动-活动页-右上角-分享
activityResultPoster220501Key: activityResultPoster220501, // 五一活动-结果页-分享海报
activityResult220501Key: activityResult220501, // 五一活动-结果页-右上角-分享
activityRecruit2205Key: activityRecruit2205, // 五月招聘季—活动页—右上角分享
inviteRecordWorkKey: inviteRecordWork, // APP各广告位-邀请好友记工
activityChargeKey: activityCharge, // 充值抽奖活动-活动页-再接再厉弹窗-立即邀请
}
意图: 降低重复代码,减少耦合(减少if else),方便扩展。
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
应用实例:
做饭,打开煤气,开火,(做饭), 关火,关闭煤气。除了做饭其他步骤都是相同的,抽到抽象类中实现
spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session
Go 实现模板方法
package template
import "fmt"
type Cooker interface {
open()
fire()
cooke()
outfire()
close()
}
// 类似于一个抽象类
type CookMenu struct {
}
func (CookMenu) open() {
fmt.Println("打开开关")
}
func (CookMenu) fire() {
fmt.Println("开火")
}
// 做菜,交给具体的子类实现
func (CookMenu) cooke() {
}
func (CookMenu) outfire() {
fmt.Println("关火")
}
func (CookMenu) close() {
fmt.Println("关闭开关")
}
// 封装具体步骤
func doCook(cook Cooker) {
cook.open()
cook.fire()
cook.cooke()
cook.outfire()
cook.close()
}
type XiHongShi struct {
CookMenu
}
func (*XiHongShi) cooke() {
fmt.Println("做西红柿")
}
type ChaoJiDan struct {
CookMenu
}
func (ChaoJiDan) cooke() {
fmt.Println("做炒鸡蛋")
}
测试用例
package template
import "testing"
func TestTemplate(t *testing.T) {
// 做西红柿
xihongshi := &XiHongShi{}
doCook(xihongshi)
// 做炒鸡蛋
chaojidan := &ChaoJiDan{}
doCook(chaojidan)
}
原文:https://learnku.com/blog/pibigstar?page=2