原创 奔跑的小梁 梁霖编程工具库 2022-12-07 10:26 发表于北京
收录于合集
#编程tips1个
#设计模式8个
需求:假设有若干种报警需求,针对这些不同的报警需求我们需要将对应的output和params序列化为不同的结果,比如报警需求A需要序列化为结果A,报警需求B需要序列化为结果B等等,我们的直接解决思路是通过if-else进行判断,但这会导致代码冗余,不利于后续的扩展[即新增一种报警规则会导致需要修改的地方不明确或比较多],可以考虑接口+实现+选择器的方式进行解耦。
直接if-else代码:代码冗余度高,且不利于扩展
// 格式化报警详情
func formatOutput(output, monitor string) string {
lines := ""
if monitor == models.LargeMeasureMonitorName {
// 突发大用量报警详情
list := models.LargeMeasureAlarmDataList{}
json.Unmarshal([]byte(output), &list)
for _, v := range list {
line := fmt.Sprintf("监控时间:%v - %v,计费项编号:%v,实例ID:%v,大于 %v %v;", v.BeginTime, v.EndTime, v.ChargeItemCode, v.InstanceNo, v.Threshold, v.OriginalMeasureUnit)
if lines == "" {
lines += line
} else {
lines = lines + "\n" + line
}
}
} else if monitor == models.LargeChargeAmountMonitorName {
// 突发金额大波动报警详情
list := models.LargeAmountAlarmDataList{}
json.Unmarshal([]byte(output), &list)
for _, v := range list {
line := ""
line = fmt.Sprintf("监控时间:%v - %v,计费详单:%v,原价%v 大于 %v元, 折后价%v 大于 %v元;",
v.BeginTime, v.EndTime, v.ChargeID, v.OriginalBillAmount, v.Threshold, v.OrigDiscountBillAmount, v.Threshold)
if lines == "" {
lines += line
} else {
lines = lines + "\n" + line
}
}
} else if monitor == models.ChargeCreateDelayMonitorName {
// 计费出账延迟
list := models.BatchJobAlarmDataList{}
json.Unmarshal([]byte(output), &list)
for _, v := range list {
// 监控时间 YYYY-MM-DD hh:mm:ss~YYYY-MM-DD hh:mm:ss , 计费单号: xxx,生成时间大于 xx 小时
line := fmt.Sprintf("监控时间 %v - %v, 计费单号: %v,生成时间大于 %v 小时;", v.BeginTime, v.EndTime, v.BatchNo, v.DDLTime)
if lines == "" {
lines += line
} else {
lines = lines + "\n" + line
}
}
} else if monitor == models.BillCreateDelayMonitorName {
// 账处出账延迟
list := models.BatchJobAlarmDataList{}
json.Unmarshal([]byte(output), &list)
for _, v := range list {
// 监控时间 YYYY-MM-DD hh:mm:ss~YYYY-MM-DD hh:mm:ss , 结算单号: xxx,生成时间大于 xx 小时
line := fmt.Sprintf("监控时间 %v - %v, 结算单号: %v,生成时间大于 %v 小时;", v.BeginTime, v.EndTime, v.BatchNo, v.DDLTime)
if lines == "" {
lines += line
} else {
lines = lines + "\n" + line
}
}
} else if monitor == models.MeasureNotCallBackMonitorName {
//没有回调
list := models.MeasureNotCallBackAlarmDataList{}
json.Unmarshal([]byte(output), &list)
for _, v := range list {
line := fmt.Sprintf("监控时间 %v - %v, 商品:%v 没有回调", v.BeginTime, v.EndTime, v.Product)
if lines == "" {
lines += line
} else {
lines = lines + "\n" + line
}
}
}
return lines
}
优化代码:通过接口+实现+选择器的方式进行解耦
// 定义接口
type AlarmCommonFormat interface {
formatParams(params string) (string, error)
formatOutput(output string) (string, error)
}
// 突发大用量格式化
type LargeMeasureFormat struct {
}
func (lmf *LargeMeasureFormat) formatParams(params string) (string, error) {
lines := ""
// 突发大用量
list := models.HeavyUsageRuleList{}
err := json.Unmarshal([]byte(params), &list)
if err != nil {
return "", err
}
for _, v := range list {
line := fmt.Sprintf("计费项编号 %v %v %v%v;", v.ChargeItemCode, compareStyleMap[v.CompareStyle], v.Threshold, v.OriginalMeasureUnit)
if lines == "" {
lines = lines + line
} else {
lines = lines + "\n" + line
}
}
return lines, nil
}
func (lmf *LargeMeasureFormat) formatOutput(output string) (string, error) {
lines := ""
list := models.LargeMeasureAlarmDataList{}
err := json.Unmarshal([]byte(output), &list)
if err != nil {
return "", err
}
for _, v := range list {
line := fmt.Sprintf("监控时间:%v - %v,计费项编号:%v,实例ID:%v,大于 %v %v;", v.BeginTime, v.EndTime, v.ChargeItemCode, v.InstanceNo, v.Threshold, v.OriginalMeasureUnit)
if lines == "" {
lines += line
} else {
lines = lines + "\n" + line
}
}
return lines, nil
}
//突发金额大波动格式化
type LargeChargeAmountFormat struct {
}
func (lcaf *LargeChargeAmountFormat) formatParams(params string) (string, error) {
lines := ""
// 突发计费金额大波动
list := models.HeavyAmountRuleList{}
err := json.Unmarshal([]byte(params), &list)
if err != nil {
return "", err
}
for _, v := range list {
// 原价 大于 100元 / 折后价 大于 100元
line := fmt.Sprintf("%v %v %v元;", billAmountMap[v.Amount], compareStyleMap[v.CompareStyle], v.Threshold.StringFixed(6))
if lines == "" {
lines = lines + line
} else {
lines = lines + "\n" + line
}
}
return lines, nil
}
func (lcaf *LargeChargeAmountFormat) formatOutput(output string) (string, error) {
lines := ""
list := models.LargeAmountAlarmDataList{}
err := json.Unmarshal([]byte(output), &list)
if err != nil {
return "", err
}
for _, v := range list {
line := ""
line = fmt.Sprintf("监控时间:%v - %v,计费详单:%v,原价%v 大于 %v元, 折后价%v 大于 %v元;",
v.BeginTime, v.EndTime, v.ChargeID, v.OriginalBillAmount, v.Threshold, v.OrigDiscountBillAmount, v.Threshold)
if lines == "" {
lines += line
} else {
lines = lines + "\n" + line
}
}
return lines, nil
}
//计费出账延迟格式化
type ChargeCreateDelayFormat struct {
}
func (ccdf *ChargeCreateDelayFormat) formatParams(params string) (string, error) {
lines := ""
// 计费出账延迟
list := models.DelayedRuleList{}
err := json.Unmarshal([]byte(params), &list)
if err != nil {
return "", err
}
for _, v := range list {
line := fmt.Sprintf("大于 %v 小时;", v.DdlTime)
if lines == "" {
lines = lines + line
} else {
lines = lines + "\n" + line
}
}
return lines, nil
}
func (ccdf *ChargeCreateDelayFormat) formatOutput(output string) (string, error) {
lines := ""
// 计费出账延迟
list := models.BatchJobAlarmDataList{}
err := json.Unmarshal([]byte(output), &list)
if err != nil {
return "", err
}
for _, v := range list {
// 监控时间 YYYY-MM-DD hh:mm:ss~YYYY-MM-DD hh:mm:ss , 计费单号: xxx,生成时间大于 xx 小时
line := fmt.Sprintf("监控时间 %v - %v, 计费单号: %v,生成时间大于 %v 小时;", v.BeginTime, v.EndTime, v.BatchNo, v.DDLTime)
if lines == "" {
lines += line
} else {
lines = lines + "\n" + line
}
}
return lines, nil
}
//账处出账延迟格式化
type BillCreateDelayFormat struct {
}
func (bcdf *BillCreateDelayFormat) formatParams(params string) (string, error) {
lines := ""
// 账处出账延迟
list := models.DelayedRuleList{}
err := json.Unmarshal([]byte(params), &list)
if err != nil {
return "", err
}
for _, v := range list {
line := fmt.Sprintf("大于 %v 小时;", v.DdlTime)
if lines == "" {
lines = lines + line
} else {
lines = lines + "\n" + line
}
}
return lines, nil
}
func (bcdf *BillCreateDelayFormat) formatOutput(output string) (string, error) {
lines := ""
// 账处出账延迟
list := models.BatchJobAlarmDataList{}
err := json.Unmarshal([]byte(output), &list)
if err != nil {
return "", nil
}
for _, v := range list {
// 监控时间 YYYY-MM-DD hh:mm:ss~YYYY-MM-DD hh:mm:ss , 结算单号: xxx,生成时间大于 xx 小时
line := fmt.Sprintf("监控时间 %v - %v, 结算单号: %v,生成时间大于 %v 小时;", v.BeginTime, v.EndTime, v.BatchNo, v.DDLTime)
if lines == "" {
lines += line
} else {
lines = lines + "\n" + line
}
}
return lines, nil
}
// 推量未回调格式化
type MeasureNotCallBackFormat struct {
}
// 推量未回调没有规则参数的格式化
func (mncbf *MeasureNotCallBackFormat) formatParams(params string) (string, error) {
return "", nil
}
func (bcdf *MeasureNotCallBackFormat) formatOutput(output string) (string, error) {
lines := ""
//没有回调
list := models.MeasureNotCallBackAlarmDataList{}
err := json.Unmarshal([]byte(output), &list)
if err != nil {
return "", err
}
for _, v := range list {
line := fmt.Sprintf("监控时间 %v - %v, 商品:%v 没有回调", v.BeginTime, v.EndTime, v.Product)
if lines == "" {
lines += line
} else {
lines = lines + "\n" + line
}
}
return lines, nil
}
// 选择方法
func GetAlarmCommonFormat(monitorName string) AlarmCommonFormat {
var acf AlarmCommonFormat = nil
switch monitorName {
case models.LargeMeasureMonitorName:
acf = &LargeMeasureFormat{}
case models.LargeChargeAmountMonitorName:
acf = &LargeChargeAmountFormat{}
case models.ChargeCreateDelayMonitorName:
acf = &ChargeCreateDelayFormat{}
case models.BillCreateDelayMonitorName:
acf = &BillCreateDelayFormat{}
case models.MeasureNotCallBackMonitorName:
acf = &MeasureNotCallBackFormat{}
}
return acf
}
vip永久刷题群双十二优惠价~
奔跑的小梁,公众号:梁霖编程工具库leetcode刷题直播教学,手把手带你刷题,双十二价格优惠通知