委托的订阅发布模式
Delegate这个关键字,在C#里翻译成委托,其英文原意就是代理,委托的意思。想想生活中委托的实例。比如生产香皂的公司,它可以把销售的业务交给代理商,而不是自己与终端用户打交道。
我们把生产香皂的公司写成类 ProductClass,负责销售的代理商写成SalesClass,生产者生产好产品以后,由仓库的人通知销售代理商拿货,最后代理商销售给终端用户(方法SalseToUser();)
到这里,我们已经创建了两个类 ProductClass和SalesClass,而负责告诉代理商过来拿货去卖的仓库人员?就是我们的重点:委托。我们把他定义为delegate GetProductToSaleHandler()。
请看代码示例:
Delegate voidGetProductToSaleHandler(object products);//生产商负责通知代理商的部门,仓库。
Public ClassProductClass
{
GetProductToSaleHandlergetProductToSaleHandler;//
Public object Product()//生产产品的类
{
……//N多代码,表示产品生产完成,生产好的产品叫products
}
Public SaleToUser(object products)
{
getProductToSaleHandler(products)//生产好以后,通知代理商来拿货去卖
}
}
Public classSalesClass
{
Public SalesToUser(object products)
{
……//N多代码,表示卖给用户了
}
}
于是我们在实际生活中发生了这样一幕:
Class program
{
Public static void Main()
{
ProductClassproductClass = new ProductClass();
SalesClass salesClass =new SalesClass();
productClass. getProductToSaleHandler+=salesClass. SalesToUser;
//注意这里,通知代理的动作。
object products = productClass.Product();
//生产好产品
productClass.Sale(products);
通知代理商去卖。
}
}
然而,我们通常是有多个代理商的,于是我们可以这样写。
Class program
{
Public static void Main()
{
ProductClassproductClass = new ProductClass();
SalesClass salesClassA =new SalesClass();
SalesClass salesClassB = new SalesClass();
SalesClass salesClassB = new SalesClass();
productClass. getProductToSaleHandler+=salesClassA. SalesToUser;
productClass. getProductToSaleHandler+= salesClassB. SalesToUser;
productClass. getProductToSaleHandler+=salesClassC. SalesToUser;
//产品生产好以后,通知A,B,C三个代理商去卖。
object products =productClass.Product();
//生产好产品
productClass.Sale(products);
通知代理商去卖。
}
}
接下来,谈谈,委托人发布订阅模式,应该在什么场景下使用。
对于我们上面的例子,ProductClass是发布者,SalsesClass是订阅者。如果发布者不愿意去做,或者没有能力去做的事。而订阅者只负责接收发布者的信息,然后去完成自己的任务。且订阅者的行为方式有多个,且可能会变化。
附件是源代码,实现的功能是:打印条码。
逻辑是:打印的条码需要根据用户配置自由生成,比如,用户的条码可以由 版本号+销售代码+机型+……组成,但有的用户可能会配置成 版本号+生产代码+车间识别码+……
而版本号,生产代码这些数据,是需要根据用户输入的条件,去数据库中查询解析的。
原代码是不能显示的那个图片,右键下载后,后缀改为zip即可