设计模式——中介模式
举例
先举一个栗子,在疫情封校期间,同学们收取快递困难。有人开设了一个代拿快递的站点。它接受同学们的代拿快递的委托(收件地点:中区 or 东区 or 西区;预期收件时间:早上 or 中午 or 晚上);兼职送快递的同学向代拿快递点提交自己能兼职送快递的时间(早上 or 中午 or 晚上)和路线(中区 or 东区 or 西区)。代拿快递点对兼职同学和代取快递需求进行匹配,如果匹配成功就向双方发出通知,需要代拿快递的同学将收到:“您的快递将由XXX(某兼职同学名字)在XX时间送达,请您按时等候”;兼职同学将收到:“您有一个快递将送给XXX(需代拿快递的同学名字),请您按时送货”。
UML图,可能写的不是十分正确,望指出错误
如果我们不用中介模式的思维去实现这个功能的话我们可以通过拓扑图来看一下
当我们通过一个中介时我们只需要接触一个中介就可以不用去和别人交流就能完成一个订单,按图里面的关系理解,作为一个人源源,通过中介就可以与小朋,小红,小灰,小紫四个进行通讯交流
但是在没有中介的情况下源源要交流就只能与另外四个人逐个联系才能进行交流,这时候,中介的优势就体现出来了,你只需要负责联系中介就可以与其他人进行联系
那么再回到一开头拿快递的例子,要实现这个功能采用中介模式,那么很明显,代拿平台就是一个中介,而兼职拿快递的同学和需要代拿服务的同学就是需要沟通的两方,他们通过一个中介两方进行建立沟通
实现
先上代码
java:
首先先实现一个中介类,类似的代拿平台也有很多种,构造一个有参构造器,可以自定义平台的名称,并给他添加一个PartTimeStu的集合属性用于存放兼职学生发布的订单。以及addPartTimeStu添加兼职订单方法,removePartTimeStu在订单完成后删除订单信息方法,orderMatch与兼职学生的订单与需要代拿快递服务的同学信息进行匹配的方法,不符合就返回showPartTimeStuMsg给需要代拿快递服务的同学一份兼职同学的名单
/**
* Created by yantailor
* on 2021/12/7 8:35 @Version 1.0
*/
//中介类 给兼职的同学和需要代拿快递的同学提供一个平台
public class Agency {
private String platForm;
private LinkedHashSet<PartTimeStu> pts = new LinkedHashSet<>();
// private LinkedList<RequireStu> rs = new LinkedList<>();
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
public Agency(String platForm){
this.platForm = platForm;
}
//添加 需要兼职的学生以及信息
public void addPartTimeStu(PartTimeStu stu){
pts.add(stu);
System.out.println(platForm+":"+stu.getName()+"在"+
simpleDateFormat.format
(new Date())+"发布了代拿快递的服务预期时间和地点为"+stu.getTimeZone()+","+stu.getPosition());
}
//删除 交易达成后奖兼职的学生在发布列表中剔除
public void removePartTimeStu(String stuName){
pts.remove(stuName);
System.out.println(stuName+"的发布信息已抹除");
}
//订单匹配
public boolean orderMatch(RequireStu requireStu){
Iterator<PartTimeStu> iterator = pts.iterator();
while(iterator.hasNext()){
PartTimeStu stu = iterator.next();
if(stu.getTimeZone() == requireStu.getTimeZone() && stu.getPosition() == requireStu.getPosition()){
System.out.println("需要代拿的同学:"+requireStu.getName()+"与兼职代拿同学"+stu.getName()+"完成匹配生成订单");
//给兼职同学发通知
stu.orderNotify(requireStu.getName());
//给要代拿服务的同学发通知
requireStu.orderNotify(stu);
//订单达成 抹除信息
removePartTimeStu(stu.getName());
return true;
}
}
System.out.println("没有符合条件的同学,为你推荐以下的代拿同学");
return false;
}
//如果订单匹配不成功就遍历所有的兼职同学信息及时更改信息也可以拿到快递
public void showPartTimeStuMsg(){
Iterator<PartTimeStu> iterator = pts.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next().toString());
}
}
}
兼职同学类,主要有一个orderNotify交易生成的信息反馈,以及构造器和GETTER SETTER方法
/**
* Created by yantailor
* on 2021/12/7 8:36 @Version 1.0
*/
public class PartTimeStu {
//兼职学生名字
private String name;
//有空代取快递的时间段 早上 or 中午 or 晚上
private String timeZone;
//有空代取快递的地方 中区 or 东区 or 西区
private String position;
//预期送到的时间
private String predictTime;
//构造器初始化填写内容
public PartTimeStu(String name , String timeZone ,String position,String predictTime) {
this.name = name;
this.position = position;
this.timeZone = timeZone;
this.predictTime = predictTime;
}
//交易生成的信息反馈
public void orderNotify(String rsName){
System.out.println("已接单,您有一个快递将送给"+rsName+",请您按时送货");
}
public String getPredictTime() {
return predictTime;
}
public void setPredictTime(String predictTime) {
this.predictTime = predictTime;
}
//提供GETTER SETTER方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTimeZone() {
return timeZone;
}
public void setTimeZone(String timeZone) {
this.timeZone = timeZone;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
@Override
public String toString() {
return "PartTimeStu{" +
"name='" + name + '\'' +
", timeZone='" + timeZone + '\'' +
", position='" + position + '\'' +
", predictTime='" + predictTime + '\'' +
'}';
}
}
需要代拿快递服务的同学类,主要的方法就是publishDemand发布订单到平台上,以及orderNotify订单被匹配成功后返回消息的方法,还有构造器GETTER SETTER方法
/**
* Created by yantailor
* on 2021/12/7 8:37 @Version 1.0
*/
public class RequireStu {
//代取人名字
private String name;
//预期收件时间的时间段 早上 or 中午 or 晚上
private String timeZone;
//代拿快递的委托的地方 中区 or 东区 or 西区
private String position;
public RequireStu(String name, String timeZon
this.name = name;
this.timeZone = timeZone;
this.position = position;
}
//发布需要取快递的需求
public void publishDemand(Agency agency){
boolean b =agency.orderMatch(this);
if(!b){
agency.showPartTimeStuMsg();
}
}
//发布需求被响应 订单完成匹配
public void orderNotify(PartTimeStu partTimeS
System.out.println("您的快递将由"+partTimeStu.g
}
//提供GETTER SETTER方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTimeZone() {
return timeZone;
}
public void setTimeZone(String timeZone) {
this.timeZone = timeZone;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
}
最后test类跑出来的结果
/**
* Created by yantailor
* on 2021/12/7 10:01 @Version 1.0
*/
public class test {
public static void main(String[] args) throws InterruptedException {
Agency agency = new Agency("小源代拿");
//提供代拿服务的学生
PartTimeStu stu = new PartTimeStu("小绿", "上午", "西区", "下午3点");
PartTimeStu stu1 = new PartTimeStu("小红", "下午", "中区", "晚上8点");
PartTimeStu stu2 = new PartTimeStu("小紫", "中午", "西区", "中午1点");
//将学生们加入到小源代拿的平台
agency.addPartTimeStu(stu);
Thread.sleep(2000);
agency.addPartTimeStu(stu1);
Thread.sleep(2000);
agency.addPartTimeStu(stu2);
//需要代拿服务的学生
RequireStu requireStu = new RequireStu("渣渣辉", "下午", "西区");
//在小源平台上发布需求
requireStu.publishDemand(agency);
RequireStu requireStu2 = new RequireStu("古田乐", "下午", "中区");
requireStu2.publishDemand(agency);
}
}
//输出的结果
小源代拿:小绿在2021-12-07 10:57:07发布了代拿快递的服务预期时间和地点为上午,西区
小源代拿:小红在2021-12-07 10:57:09发布了代拿快递的服务预期时间和地点为下午,中区
小源代拿:小紫在2021-12-07 10:57:11发布了代拿快递的服务预期时间和地点为中午,西区
//requireStu
没有符合条件的同学,为你推荐以下的代拿同学
PartTimeStu{name='小绿', timeZone='上午', position='西区', predictTime='下午3点'}
PartTimeStu{name='小红', timeZone='下午', position='中区', predictTime='晚上8点'}
PartTimeStu{name='小紫', timeZone='中午', position='西区', predictTime='中午1点'}
//requireStu2
需要代拿的同学:古田乐与兼职代拿同学小红完成匹配生成订单
已接单,您有一个快递将送给古田乐,请您按时送货
您的快递将由小红在晚上8点时间送达,请您按时等候
小红的发布信息已抹除
python:
class info():
#"兼职学生发布的信息"
def __init__(self,name,area, time):
self.__name = name
self.__area = area
self.__time = time
def getInfo(self):
print(self.__name+"在"+self.__time+"去"+self.__area+"代拿")
def getName(self):
return self.__name
def getArea(self):
return self.__area
def getTime(self):
return self.__time
class partTimeStu():
#"兼职学生"
def __init__(self,name):
self.__name = name
self.__partTimeStuInfo = None
self.__predictOfTime = None
def setInfo(self ,area , time):
self.__area = area
self.__time = time
self.__partTimeStuInfo = info(self.__name , self.__area,self.__time)
# def getInfo(self,info):
# self.__partTimeStuInfo = info
def registerIntoAgency(self,agency):
agency.addPartTimeStuInfo(self.__partTimeStuInfo)
print(self.__name+"在"+agency.getName()+"发布带拿快递的信息")
def orderDeal(self,requiredStuName):
print("交易生成,您有一个快递将送给"+requiredStuName+",请您按时送货")
def orderFinish(self,time):
self.__predictOfTime = time
return self.__predictOfTime
class agency():
#"快递代拿平台"
def __init__(self,name):
self.__partTimeStuInfo = []
self.__name = name
def getName(self):
return self.__name
def addPartTimeStuInfo(self,partTimeStu):
self.__partTimeStuInfo.append(partTimeStu)
def showPartTimeStuInfo(self):
for i in self.__partTimeStuInfo:
i.getInfo()
def orderMatch(self , requiredStuInfo ):
for i in self.__partTimeStuInfo:
if requiredStuInfo.getArea() == i.getArea() and requiredStuInfo.getTime() == i.getTime():
print("您的快递将由" + i.getName() + "在" + "xx" + "时间送达,请您按时等候")
print("交易生成,您有一个快递将送给" + requiredStuInfo.getName() + ",请您按时送货")
class requiredStu():
#"需要帮忙代拿快递的学生"
def __init__(self,name):
self.__name = name
self.__requiredStuInfo = None
def setInfo(self ,area , time):
self.__area = area
self.__time = time
self.__requiredStuInfo = info(self.__name ,self.__area,self.__time)
def orderDeal(self,partTimeStuName,finishTime):
print("您的快递将由"+partTimeStuName+"在"+finishTime+"时间送达,请您按时等候")
def getInfo(self):
return self.__requiredStuInfo
if __name__ == '__main__':
a = agency("小源代拿")
pts = partTimeStu("小红")
pts.setInfo("中区","下午")
pts.registerIntoAgency(a)
# a.showPartTimeStuInfo()
rs = requiredStu("小灰")
rs.setInfo("中区","下午")
a.orderMatch(rs.getInfo())
python在内容上有所不同,但是功能大体上相同,有些方法没在相对应的类上面实现,实现的思路两个语言大致相同
本人水平有限,希望大家能指出错误,谢谢