委托系列03-委托的作用与意义

一、需求模拟

分别有武汉人、上海人、广东人,三种不同城市的学生,问候的口语不一样,模拟见面打招呼。

二、代码准备

    /// <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、特点

即使新增了一种新的打招呼方式,只需要新增一个方法即可,既不会影响其他打招呼的方法代码逻辑,也实现了扩展。

五、总结

推荐这些文章:

打卡3本书10句话-03

为什么精英可以打造10倍高效团队46

该怎么做,为什么应该这么做
Aim目标设定法则建立更加形象,7分钟的奇迹
设定意义目标和成果目标,释放创造力,增强主人翁意识,主动,自觉
成果目标,6个方针 1)乐在其中Enjoy 2)自己做Our team 3)全力以赴Do your best 4)专注眼前问题Concentration 5)敢于挑战 improve 6)先从打招呼开始Communication
合适的目标,行动的意义,清晰的表达,自主性和创造性
突破口,自主创造
Action checklist 检查清单

[ ] 行动的意义是否明确
[ ] 创造的成果是否明确
[ ] 采取什么样...

委托系列02-委托的实例化及执行

一、代码准备
/// <summary>
/// 1.无参数无返回值委托
/// </summary>
public delegate void NoReturnNoParaOutClass();
public class CustomDelegate //: MulticastDelegate
{
/// <summary>
/// 2.无参数无返回值委托
/// </summary>
public delegate void No...

委托系列05-Action/Func

一、为什么会有Action和Func

二、Action和Func的声明及区别
1、Action
1、普通委托的声明和调用
委托:
/// <summary>
/// 无参数无返回值委托
/// </summary>
public delegate void NoParamNoReturnDelegate();

/// <summary>
/// 有参数无返回值委托
/// </summary>
/// <pa...

Java 8系列之Lamda的基本语法

Lamda的基本语法:
如果要理解Lamda表达式 , 需要先理解匿名内部类lamda的三种形式:  a. (参数) -> 单行语句  b. (参数) -> {单行语句}  c. (参数) -> 表达式
 
a. 第一种形式: (参数) -> 单行语句

interface IMessage{
//a.单行语句:直接输出语句
public void print(String str);
}

public class LamdaTest {

public static void main(String[] args) {
...

委托系列06-多播委托

一、多播委托的介绍

二、代码准备
/// <summary>
/// 多播委托
/// </summary>
public class CustomMulticastDelegation
{
private void DoNothing()
{
Console.WriteLine("This is DoNothing");
}

private void DoNothing(int i)
{
Cons...

委托系列07-多播委托之观察者模式

一、案例需求
  有一个Cat类,其中有一个Miao(猫叫)的方法。每次猫叫后,其他动物就会执行响应的动作。
代码:
public class Cat
{
public void Miao()
{
Console.WriteLine("{0} Miao", this.GetType().Name);
}
}

二、普通方式
代码:
public class Cat
{
public void Miao()
{
Console....

C#基础知识系列九(对IEnumerable和IEnumerator接口的糊涂认识)

查看并使用两个接口
 接下来我们先来看看两个接口的定义。
  先来看一下IEnumerable接口,其实看过这个接口之后,发现它其实是非常的简单,只包含一个方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象,如下面截图所示:

这里的IEnumerator对象,其实就是另外一个接口,这个接口对象有什么呢?它是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项,假如连集合中的项都访问不了,那么进行集合的循环遍历是不可能的事情了。那么让我们看看IEnumerator接口又定义了什...

Java基础系列(11)- 枚举类

枚举类的使用:入门

枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类

当需要定义一组常量时,强烈建议使用枚举类

如果枚举类中只有一个对象,则可以作为单例模式的实现方式

比如:星期、季节等
定义枚举类
自定义枚举类
public class SeasonTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring);
}
}

class Season{
//1.声...

方法中调用方法本身的是什么?

问题

static void Main(string[] args)
{
Console.WriteLine(test(5));
}
public static int test(int i)
{
if (i <= 0)
return 0;
else if (i > 0 && i <= 2)
return 1;
...

0x05、设计模式原则 —— 开闭原则

开闭原则(Open Closed Principle) 是编程中最基础、最重要的设计原则
一个软件实体,比如:类,模块和函数应该对扩展开放(对提供方而言), 对修改关闭(对使用方而言)。 用抽象构建框架,用实现扩展细节。
当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。
编程中遵循其它原则,以及使用设计模式的目的就是遵循开闭原则。
 
演示
假设有如下UML类图,Retangle矩形类 和 Circle圆形类 继承至 Shape;

 
 上图代码实现:

public static void Main(string[...

文章标题:委托系列03-委托的作用与意义
文章链接:https://www.dianjilingqu.com/51207.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>