Java学习之路13----中介者模式

什么是中介者模式

概括

中介者模式就是有一个中介类,里面存储者各个工作的“同事类”,当有一些功能需要共同调用多个类的不同方法时,就在中介类中对同事类进行调用和实现(在中介类中实现功能)。

模式结构

  • 抽象中介者(Mediator):定义了同事对象到中介者对象的接口。
  • 具体中介者(ConcreteMediator):具体中介者对象,实现了抽象类方法,它需要知道所有具体同事类,并从具体同事对象接收消息,向其他同事类发送命令。
  • 抽象同事类(Colleague):定义抽象同事类中方法。
  • 具体同事类(ConcreteColleague):具体同事类,每个具体同事类只知道自己的行为,而不了解其他同事的情况,但他们都认识中介者对象。

中介者模式的实现

题目

超市有三个角色部门:销售部门、仓库部门、采购部门。这三个部门之间是相互依赖的。采购部门要根据销售部门的销售情况确定是否采购,也需要根据仓库的库存量决定是否采购,而销售部门只有在仓库部门有库存的情况下才能正常销售。

题目分析

这里有3个部门3个类,分别需要实现:
1.采购类中的 判断是否需要采购功能
2.销售类中的 判断是否可以销售功能,进行产品销售情况统计
3.仓库类中的 数据采集统计功能

在功能1,2中判断条件都为仓库类中的数据,而1还要对销售类的销售情况进行读取判断。这样在类1就要调用类2,3的两个对象,在类2要调用类3对象。每个类都与其他两个类产生了关联,根据迪米特法则,每个类只和朋友类交流,这个朋友类,并不是越多越好,朋友类越多,耦合性越大,想要修改一个类就得修改一大片,这不是面向对象设计所期望的,况且这里还是只有三个部门的情况,现实中,一个公司可能会有几十个部门,并且各个部门之间也都是存在关联的,形成了一个蜘蛛网的结构,如果按照上面方式进行编码的话,单单维护起来就已经让人头大了。所以,我们必须对上面的代码进行重新设计。

这时使用中介者模式,在中介者类进行功能的实现与调用即可。

具体实现

同事类:

public abstract class Colleague {
	public abstract void input();
	public abstract void output() ;
}

public class Buyer extends Colleague{
	 private Mediator m;//持有中介者对象引用
	public Buyer(Mediator m)
	{
		this.m=m;
		 m.register("Buyer", this);
	}
	public void input() {
		System.out.println("采购");
	}	
	public void output() {
		m.command("Sell");
		m.command("Store");
	
	}
}

public class Sell extends Colleague{
	 private Mediator m;//持有中介者对象引用
	public Sell(Mediator m)
	{
		this.m=m;
		 m.register("Sell", this);
	}
		public void input() {
			System.out.println("统计销售情况");
		}
		
		public void output() {
			m.command("Store");
		}
}

public class Store extends Colleague{
	 private Mediator m;//持有中介者对象引用
	public Store(Mediator m)
	{
		this.m=m;
		//先在中介上记录自己的类
		 m.register("Store", this);
	}
		public void input() {
			System.out.println("统计数量");
		}	
		
		//需要多类协调工作
		public void output() {
			
		
		}
}

中介者:

public interface Mediator {
    void register(String name,Colleague d);//记录所有同事类
    void command(String name);//发出命令
} 

public class Media implements Mediator{
    private Map<String,Colleague> map=new HashMap<String,Colleague>();

    @Override
    public void register(String name, Colleague d) {
        map.put(name, d);
    }

    @Override
    public void command(String name) {
        map.get(name).input();    
    }
}

Client:

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
			//先建立中介者
			Mediator m=new Media();
		
			Sell sell=new Sell(m);
			Store store=new Store(m);
			Buyer buyer =new Buyer(m);
			
			sell.input();
			System.out.println("");
			sell.output();
			System.out.println("");
			buyer.input();
			System.out.println("");
			buyer.output();
	}

}

输出:

统计销售情况

统计数量

采购

统计销售情况 统计数量

总结

中介者模式的优点就是减少了类间的依赖,把原有的一对多的依赖变成了一对一的依赖,降低了类间的耦合。中介者模式的缺点就是中介者会膨胀的很大,而且逻辑复杂,同事类越多,中介者的逻辑就越复杂。中介者模式适用于多个对象之间紧密耦合的情况,紧密耦合的标准是:在类图中出现了蜘蛛网状结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值