在设计模式的学习过程中,委托是一个不容易理解的知识点。尤其是在学完代理模式之后,就更不知道什么是什么了。下面分别看一下各自的实例,来看一下这两者有什么区别。
委托是一种引用方法的类型。一旦为委托分配了方法,委托将于该方法具有完全相同的行为。委托的方法的使用可以向其他任何方法一样,具有参数和返回值。
委托可以是对函数的抽象,即为函数的“类”,委托的实例对象将代表一个具体的函数。
运行结果:
委托是一种引用方法的类型。一旦为委托分配了方法,委托将于该方法具有完全相同的行为。委托的方法的使用可以向其他任何方法一样,具有参数和返回值。
委托可以是对函数的抽象,即为函数的“类”,委托的实例对象将代表一个具体的函数。
委托的实例:
class Program
{
static void Main(string[] args)
{
Teacher Tc = new Teacher("赵老师"); //实例化老师和学生
Student St1 = new Student("张三");
Student St2 = new Student("李四");
//把学生的行为交给 委托
Tc.TeacherCome += new Teacher.EventHandler(St1.StopCopyWork);
Tc.TeacherCome += new Teacher.EventHandler(St2.StopWhisper);
Tc.Come();
}
}
class Teacher
{
private string name;
public Teacher(string name)
{
this.name = name;
}
public delegate void EventHandler(); //声明一个委托EventHandler
public event EventHandler TeacherCome; //声明事件名称,事件类型为EventHandler
public void Come() //老师的行为
{
Console.WriteLine("{0}来了", name);
if (TeacherCome != null) //如果需要委托,则执行下面程序
{
TeacherCome();
}
}
}
class Student
{
private string name;
public Student(string name)
{
this.name = name;
}
public void StopWhisper()
{
Console.WriteLine("老师来了,{0}停止说话",name);
}
public void StopCopyWork()
{
Console.WriteLine("老师来了,{0}停止抄作业",name);
}
}
运行结果:
代理模式:
为其他对象提供一种代理,来帮助达到目的。
代理模式实例:
class Program
{
static void Main(string[] args)
{
SchoolGirl mm = new SchoolGirl();
mm.Name = "jiaojiao";
Proxy daili = new Proxy(mm);
daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChocolate();
}
}
class SchoolGirl //定义 女孩类
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
interface IGiveGift //创建一个送礼物的接口
{
void GiveDolls();
void GiveFlowers();
void GiveChocolate();
}
class Pursuit:IGiveGift //追求者类,使用送礼物的接口
{
SchoolGirl mm; //要追求女孩的名字
public Pursuit(SchoolGirl mm)
{
this.mm = mm;
}
public void GiveDolls()
{
Console.WriteLine(mm.Name+"送你洋娃娃");
}
public void GiveFlowers()
{
Console.WriteLine(mm.Name + "送你花");
}
public void GiveChocolate()
{
Console.WriteLine(mm.Name + "送你巧克力");
}
}
class Proxy : IGiveGift //定义代理模式,也用送礼物的接口
{
Pursuit gg;
public Proxy(SchoolGirl mm) //区别在于,代替追求者 送礼物
{
gg=new Pursuit(mm);
}
public void GiveDolls()
{
gg.GiveDolls();
}
public void GiveFlowers()
{
gg.GiveFlowers();
}
public void GiveChocolate()
{
gg.GiveChocolate();
}
}
运行结果:
委托与代理的比较
代理:是把一些事情交给某人帮忙去完成。
委托:是当某件事情发生的时候,顺便干某件事情。委托就相当于一个触发器罢了。