设计模式_中介者模式

定义

Define an object that encapsulates how a set of objects interact.  Mediator promptes loose
coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.(用一个中介对象封装一系列的对象交互。中介者使各对象不须要显示地相互作用。从而使其耦合松散,并且能够独立地改变它们之间的交互)

不认识的单词

encapsulates: 总结。扼要概括。囊括

a set of :一系列

interact:相互作用。互相影响;互动

loose: 松的,宽的;模糊的。散漫的;自由的

coupling: 耦合

referring :提到( refer的如今分词 );针对。关系到;请教

explicitly:明白地,明白地

vary:变化。不同,偏离;[生]变异

举例

比如以下的图

採购管理,销售管理,存货管理.....多个模块之间有交流,假设须要维护改动什么的。谁愿意去当那个程序员?

依据网络拓扑结构,有三种类型。总线型。环形,星型。

依据这个设计出例如以下

类图

分析类图:三个子模块继承AbstractColleague,Mediator继承AbstractMediator,其父类有三个子模块的实例。另一个统一处理的execute方法()。完毕特定的任务。须要三个子模块中独立的方法。

public abstract class AbstractColleague {

 protected AbstractMediator mediator; //为何是protected:仅仅对子类公开

 public AbstractColleague(AbstractMediator mediator){
  this.mediator=mediator;
 }
}
public abstract class AbstractMediator {
 protected Purchase purchase;
 protected Sale sale;
 protected Stock stock;

 public AbstractMediator(){
  purchase=new Purchase(this);
  sale=new Sale(this);
  stock=new Stock(this);
 }
 public abstract void execute(String str,Object...objects);
}

三个同事。各做各的事

public class Purchase extends AbstractColleague {
 public Purchase(AbstractMediator mediator) {
  super(mediator);
 }

 public void buyIBMcomputer(int number){
  super.mediator.execute("purchase.buy",number);
 }
 public void refuseBuyIBM(){
  System.out.println("不再採购IBM电脑");
 }
}
public class Sale extends AbstractColleague {
 public Sale(AbstractMediator mediator) {
  super(mediator);
 }

 public void sellIBMComputer(int number){
  super.mediator.execute("sale.sell",number);
  System.out.println("销售电脑:"+number+"台");
 }

 //反馈,0~100变化
 public int getSaleStatus(){
  Random rand=new Random(System.currentTimeMillis());
  int saleStatus=rand.nextInt(100);
  System.out.println("IBM电脑的销售情况为:"+saleStatus);
  return saleStatus;
 }
 public void offSale(){
  super.mediator.execute("sale.offsell");
 }
}
public class Stock extends AbstractColleague {
 public Stock(AbstractMediator mediator) {
  super(mediator);
 }

 private static int COMPUTER_NUMBER=100;

 public void increase(int number){
  COMPUTER_NUMBER+=number;
  System.out.println("库存数量:"+COMPUTER_NUMBER);
 }
 public void decrease(int number){
  COMPUTER_NUMBER-=number;
  System.out.println("库存数量:"+COMPUTER_NUMBER);
 }
 public int getStockNumber(){
  return COMPUTER_NUMBER;
 }
 public void clearStock(){
  System.out.println("清理存货数量:"+COMPUTER_NUMBER);
  super.mediator.execute("stock.clear");
 }
}

中介者,处理复杂的业务。调用三个同事中一个或多个方法。

public class Mediator extends AbstractMediator {
 @Override
 public void execute(String str, Object... objects) {
  if(str.equals("purchase.buy")){           //採购电脑
   this.buyComputer((Integer)objects[0]);
  }else if(str.equals("sale.sell")){       //销售电脑
   this.sellComputer((Integer)objects[0]);
  }else if(str.equals("sale.offsell")){  //折价销售
   this.offSell();
  }else if(str.equals("stock.clear")){  //清仓处理
   this.clearStock();
  }
 }
 private void buyComputer(Integer number) {
  int saleStatus=super.sale.getSaleStatus();
  if(saleStatus>80){	 //销售状态好
   System.out.println("採购IBM电脑:"+number+"台");
   super.stock.increase(number);
  }else{	 //销售状态不好
   int buyNumber=number/2;
   System.out.println("採购IBM电脑:"+buyNumber+"台");
  }
 }
 private void sellComputer(Integer number) {
  if(super.stock.getStockNumber()<number){ //库存不足不够销售
   super.purchase.buyIBMcomputer(number);
  }
  super.stock.decrease(number);
 }
 //折价销售
 private void offSell() {
  System.out.println("折价销售IBM电脑"+stock.getStockNumber()+"台");
 }
 //清仓处理
 private void clearStock() {
  super.sale.offSale();
  super.purchase.refuseBuyIBM();
 }
}

測试

public static void main(String[] args) {
  AbstractMediator mediator=new Mediator();   //一个中介者
  System.out.println("------------採购人员採购电脑--------------");
  Purchase purchase=new Purchase(mediator);  //查看其抽象类的构造方法就知道
  purchase.buyIBMcomputer(100);
  System.out.println("-------------销售人员销售电脑-------------");
  Sale sale=new Sale(mediator);
  sale.sellIBMComputer(1);
  System.out.println("------------库房管理人员清库处理--------------");
  Stock stock=new Stock(mediator);
  stock.clearStock();
 }

说明

public abstract void execute(String str,Object...objects);  可变參数数组,详细可訪问 http://blog.csdn.net/testcs_dn/article/details/38920323

悟:多个模块之间有耦合,须要交流时,业务写的非常杂非常乱,这时候须要一个中介来管理麻烦事。

通用写法

public abstract class Mediator {
//定义同事类
protected ConcreteColleague1 c1;
protected ConcreteColleague2 c2;
//通过getter/setter方法把同事类注入进来
public ConcreteColleague1 getC1() {
return c1;
}
public void setC1(ConcreteColleague1 c1) {
this.c1 = c1;
}
public ConcreteColleague2 getC2() {
return c2;
}
public void setC2(ConcreteColleague2 c2) {
this.c2 = c2;
}
//中介者模式的业务逻辑
public abstract void doSomething1();
public abstract void doSomething2();
}
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator _mediator){
this.mediator = _mediator;
}
}
public class ConcreteMediator extends Mediator {
@Override
public void doSomething1() {
//调用同事类的方法,仅仅要是public方法都能够调用
super.c1.selfMethod1();
super.c2.selfMethod2();
}
public void doSomething2() {
super.c1.selfMethod1();
super.c2.selfMethod2();
}
}
public class ConcreteColleague1 extends Colleague {
//通过构造函数传递中介者
public ConcreteColleague1(Mediator _mediator){
super(_mediator);
}
//自有方法 self-method
public void selfMethod1(){
//处理自己的业务逻辑
}
//依赖方法 dep-method
public void depMethod1(){
//处理自己的业务逻辑
//自己不能处理的业务逻辑,托付给中介者处理
super.mediator.doSomething1();
}
}

各个同事单一的任务,各干各的事,而中介者ConcreteMediator 这个项目经理须要调动各部分完毕一件事。

长处

降低了耦合,降低了依赖

缺点

同事类越多。越复杂,适合小系统

使用场景

在类图中出现了蜘蛛网网状结构

实际应用举例

机场调度中心

MVC框架: C(Controller) 就是一个中介者,前端控制器,就是把M(Model,业务逻辑)和V(Viw,视图)隔离开

中介服务

同事 :  abstract

兄弟 :  interface

这个比喻有点逗

我是菜鸟,我在路上。

时间: 2024-10-11 19:02:13

设计模式_中介者模式的相关文章

大话设计模式_中介者模式(Java代码)

中介者模式:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 简单描述:1个抽象Colleague,其派生多个具体ConcreteColleague,每个具体ConcreteColleague都认识一个具体中介者.他们发送消息的时候是通过中介者发送.1个中介者,具体中介者认识所有的ConcreteColleague(即持有所有具体ConcreteColleague的引用),它提供向其他具体ConcreteColleag

java设计模式_中介者模式

/**  * @Title: Country.java  * @Package com.wangbiao.design.mediator  * @Description: TODO   * @author wangbiao     * @date 2014-9-24 下午12:02:02   * @version V1.0  */ package com.wangbiao.design.mediator; /**  * @Title: Country.java  * @Package com.w

【GOF23设计模式】中介者模式

来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 1 package com.test.mediator; 2 /** 3 * 同事类的接口 4 */ 5 public interface Department { 6 void selfAction();//做本部门的事情 7 void outAction();//向总经理发出申请 8 } 1 package com.test.mediator; 2 3 public class

设计模式之中介者模式(Mediator)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

大话设计模式_简单工厂模式(Java代码)

简单的描述:一个父类.多个子类,实例化那个子类由一个单独的工厂类来进行 图片摘自大话设计模式: 运算类: 1 package com.longsheng.simpleFactory; 2 3 public class Calculate { 4 5 private double firstNum; 6 private double secondNum; 7 8 public double getFirstNum() { 9 return firstNum; 10 } 11 12 public v

大话设计模式_抽象工厂模式(Java代码)

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. 简单描述:有多种抽象产品,并且每种抽象产品都有多个具体产品.一个抽象工厂,提供多个具体工厂,每个工厂则提供不同种类的具体产品. 大话设计模式中的截图: 例子代码: AbstractProductA类: 1 package com.longsheng.abstractfactory; 2 3 public abstract class AbstractProductA { 4 5 public abstract v

设计模式之中介者模式20170731

行为型设计模式之中介者模式: 一.含义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 同事角色与其他同时角色通信的时候,一定要通过中介者角色(中介者封装了各个同事类之间的逻辑关系) 二.代码说明 1.主要有两个角色 1)中介者角色 通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色. 2)同事角色 每一个同事角色都知道中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作. 每个同事类的行为分

设计模式(中介者模式-对象去耦)

声明:本系列文章内容摘自<iOS设计模式> 中介者模式 用一个对象来封装一系列对象的交互方式.中介者使个对象不需要显式地相互调用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 何时使用中介者模式 1.对象间的交互虽定义明确然而非常复杂,导致椅子对象彼此相互依赖而且难以理解: 2.因为对象引用了许多其他对象并与其通信,导致对象难以复用: 3.想要制定一个分布在多个对象中的逻辑或行为,又不想生成太多子类. 举个例子 有三个视图,我们可能需要两两之间进行跳转,类比于公司内同时每两个人都有可能

【设计模式】——中介者模式

中介者模式(Mediator),用一个中介者对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. Colleague叫做抽象同事类,而ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象,Mediator是抽象中介者,定义了同事对象到中介者对象的接口,ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接