设计模式看的有些不懂,也不知理解对不对,千里之行,始于键盘下,于是写个代码感受一下。
网上有些中介者的例子,有个举得是公司内各部门间的例子,感觉阐释的挺好,在我理解看来,倘若有10种对象,他们都有一个变量叫‘库存’,于是可能每个对象都要维护这个库存变量,而且这个变量的改变会影响其他对象,那么可不可以把这个变量拿出来单独放在一个地方,也许此时可以考录把它放在中介者里,感觉有点像全局变量,现实中这个中介者或许有些像服务中心,或者有人说是中介,这个中介者不但能放变量,还可以提供服务。
写了个就餐的小程序,差强人意吧。
里面包含顾客,厨师,和服务员,服务员是顾客和厨师的中介者,顾客一来就狮子大开口说要吃一吨鱼,而厨师做不了这么多鱼,所以由服务员来调停。
#include <stdio.h>
#include <stdlib.h>
struct Customer {
struct Waiter* waiter;
int ( *request) (struct Customer* customer, int fish);
};
struct Cooker {
struct Waiter* waiter;
void ( *cook)(struct Cooker* cooker, int fish);
};
struct Waiter { //中介者waiter负责提供数据供双方访问,类似于全局变量
int fish;
struct Customer* customer; //当customer指向waiter后,就可以通过访问waiter中的结构体来访问其他对象
struct Cooker* cooker;
int ( *wrequest)(struct Customer* customer, int fish); //customer
};
void cook (struct Cooker* cooker, int fish) {
cooker->waiter->fish = fish;
}
int request (struct Customer* customer, int fish) {
return customer->waiter->wrequest(customer, fish); //调用终结者中的函数 ,使维护集中在中介者中
}
int wrequest (struct Customer* customer, int fish) { //很多资源和函数都集中在中介者中,
if (fish > customer->waiter->fish) {
printf ("抱歉,厨师反馈没有 %d 那么多鱼了,重新点菜吧。\n", fish);
return -1;
}
else {
printf ("点菜成功,厨房还有很多鱼,足够你们吃了\n");
return 0;
}
}
int fish(void) {
return rand()%50 +40;
}
int main (void) {
srand((unsigned) time(0));
struct Customer customer;
struct Cooker cooker;
struct Waiter waiter;
waiter.wrequest = wrequest;
cooker.waiter = &waiter;
customer.waiter = &waiter;
cooker.cook = cook;
customer.request = request;
cooker.cook (&cooker, 50); //厨师今天只能做50条鱼
while (customer.request (&customer, fish())); //消费者跟服务员waiter说要个N条大鱼
}
return customer->waiter->wrequest(customer, fish); //调用终结者中的函数 ,使维护集中在中介者中
}
这是消费者的请求函数,说是要吃多少鱼,请求时调用中介者,真正的函数实现是在中介这种,于是核心的数据和方法会集中到中介者中,也许就把分散在不同类中的东西集中到了一起,从维护多个类或对象,到把重点放在中介者上也许就简单了吧。