现实中,对象与对象相互影响的情况很常见,一对多相互关联的关系也很正常,由于这些对象之间耦合性太高,所以引入中介者模式,降低对象之间的耦合,将网状结构改为星型结构,所有对象对其他对象的变化通过中介者来通知。但是容易滥用中介者模式,当项目中出现多对多关系的时候,考虑下是否设计不合理。示例如下:
public class Intermediary {
public static void main(String[] a){
Intermediary intermediary=new Intermediary();
ICoder 张三 = intermediary.new Coder("张三");
ICoder 李四 = intermediary.new Coder("李四");
ICoder 王二 = intermediary.new Coder("王二");
ICoder 麻子 = intermediary.new Coder("麻子");
ICoder 二狗 = intermediary.new Coder("二狗");
IMedia 张三的中介 = intermediary.new Media();
张三的中介.addCoder(李四);
张三的中介.addCoder(王二);
张三的中介.addCoder(麻子);
张三.setMedia(张三的中介);
IMedia 李四的中介 = intermediary.new Media();
李四的中介.addCoder(张三);
李四的中介.addCoder(二狗);
李四.setMedia(李四的中介);
张三.modifyCode("Intermediary类,加了一个内部类");
李四.modifyCode("Intermediary类,加了几个字段");
}
abstract class ICoder{
private String name;
public ICoder(String name) {
this.name = name;
}
public String getName() {
return name;
}
abstract void modifyCode(String msg);
abstract void getEditor(ICoder iCoder,String msg);
abstract void setMedia(IMedia iMedia);
}
class Coder extends ICoder{
private IMedia iMedia;
public Coder(String name) {
super(name);
}
public void setiMedia(IMedia iMedia) {
this.iMedia = iMedia;
}
@Override
public void modifyCode(String msg) {
System.out.println(getName()+"说:我刚刚改了"+msg);
if(iMedia!=null)
iMedia.notifyMsg(this,msg);
}
@Override
void getEditor(ICoder iCoder,String msg) {
System.out.println(iCoder.getName()+"修改了"+msg+","+getName()+"说:你又偷偷加BUG");
}
@Override
public void setMedia(IMedia iMedia) {
this.iMedia=iMedia;
}
}
interface IMedia{
void notifyMsg(ICoder iCoder,String msg);
void addCoder(ICoder coder);
void removeCoder(ICoder coder);
}
class Media implements IMedia{
private List<ICoder> coders=new ArrayList<>();
@Override
public void addCoder(ICoder coder) {
coders.add(coder);
}
@Override
public void removeCoder(ICoder coder) {
coders.remove(coder);
}
@Override
public void notifyMsg(ICoder iCoder,String msg) {
for(ICoder coder:coders){
coder.getEditor(iCoder,msg);
}
}
}
}
网友评论