一、需求模拟
分别有武汉人、上海人、广东人,三种不同城市的学生,问候的口语不一样,模拟见面打招呼。
二、代码准备
/// <summary>
/// 学生类
/// </summary>
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int ClassId { get; set; }
public int Age { get; set; }
}
三、常用方式
1、通过枚举,定义不同的城市学员
public enum UserType
{
Wuhan = 1,
Shanghai = 2,
GuangDong = 3,
BeiJing = 4
}
打招呼:
/// <summary>
/// 问好
/// </summary>
public void SayHi(UserType type)
{
Console.WriteLine("问候前。。。招招手。。。");
switch (type)
{
case UserType.Wuhan:
Console.WriteLine("吃了么?过早了吗?");
break;
case UserType.Shanghai:
Console.WriteLine("侬好!");
break;
case UserType.GuangDong:
Console.WriteLine("雷猴!");
break;
default:
throw new Exception("NO UserType"); //不掩盖错误
}
Console.WriteLine("你好!");
}
调用:
Student student = new Student()
{
Id = 1234,
Name = "慎独",
Age = 25,
ClassId = 1
};
student.SayHi(UserType.Wuhan);
student.SayHi(UserType.Shanghai);
student.SayHi(UserType.GuangDong);
2、每个城市的学员创建一个打招呼的方法
/// <summary>
/// 武汉人打招呼
/// </summary>
public void SayHiWuhHan()
{
Console.WriteLine("吃了么?过早了吗?");
}
/// <summary>
/// 上海人打招呼
/// </summary>
public void SayHiShangHai()
{
Console.WriteLine("侬好!");
}
/// <summary>
/// 广东人打招呼
/// </summary>
public void SayHiGuangDong()
{
Console.WriteLine("雷猴!");
}
调用:
Student student = new Student()
{
Id = 1234,
Name = "慎独",
Age = 25,
ClassId = 1
};
student.SayHiWuhHan();
student.SayHiShangHai();
student.SayHiGuangDong();
四、常用方式存在的问题
1、新增需求
- 1、来了一个北京人,北京人打招呼的当时和上面3个城市的都一样。
- 2、每个打招呼前都要加一个一样的语句。
2、枚举方式的解决方案
a、修改枚举
b、修改打招呼的方法,增加一个条件判断
注意:修改此方法存在风险,函数发生了改变,可能会引起其他的逻辑,需要重复测试
c、新增一个打招呼前的语句
3、非枚举方式的解决方案
a、新增一个北京人打招呼的方法
b、在每个打招呼方法前新增一个打招呼前的语句
4、优缺点
a、枚举方式
优点:新增通用语句方便,只需要在函数前面新增即可。
缺点:新增一种打招呼方式就需要修改枚举类型和打招呼的函数逻辑,带来风险。
b、非枚举方式
优点:每个城市的打招呼方法相对独立,互不干扰。
缺点:新增通用语句麻烦,需要在每个打招呼的函数前面新增。
四、委托
以上这两种都有不完美的地方----有没有既可以没有那么多的重复代码,也相对稳定的方案呢?--有
SayHiPerfect---
传递枚举的时候:目的是为了选择不同的业务逻辑:既然最终都是要选择业务逻辑的;--就可以传递逻辑呗;逻辑是什么--逻辑其实就行为---行为就是方法---方法的传递;就需要把方法当做参数一样传递过来;--委托在实例化的时候,委托就要一个方法;就可以传递一个委托,把方法放在委托中传递过来;
1、使用
a、新增一个委托
public delegate void SayHiDalegate();
b、新增一个方法,参数为每个打招呼的方法
/// <summary>
/// 既没有重复代码-0-也相对稳定的方法---完美方法;
/// </summary>
public void SayHiperfect(SayHiDalegate sayHiDalegate)
{
Console.WriteLine("问候前,招招手。。。");
sayHiDalegate.Invoke();
}
c、调用
SayHiDalegate sayHiDalegate = new SayHiDalegate(student.SayHiWuhHan);
student.SayHiperfect(sayHiDalegate);
SayHiDalegate sayHiDalegate1 = new SayHiDalegate(student.SayHiShangHai);
student.SayHiperfect(sayHiDalegate1);
SayHiDalegate sayHiDalegate2 = new SayHiDalegate(student.SayHiGuangDong);
student.SayHiperfect(sayHiDalegate2);
SayHiDalegate sayHiDalegate3 = new SayHiDalegate(student.SayHiBeijing);
student.SayHiperfect(sayHiDalegate2);
2、特点
即使新增了一种新的打招呼方式,只需要新增一个方法即可,既不会影响其他打招呼的方法代码逻辑,也实现了扩展。