设计模式(八)---中介者模式

2024-06-10 23:18
文章标签 设计模式 模式 中介

本文主要是介绍设计模式(八)---中介者模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定义:用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互交互,从而使其耦合松散,而且可以独立地改变他们之间的交互。

  中介者就是将蜘蛛网状的用户关系模型改变成星形的用户关系模型。

中介者的通用模型

Mediator抽象中介者角色
   --|抽象中介者角色定义统一的接口,用于各同事角色直接的通信。
  Concrete Mediator 具体中介者角色
   --|具体中介者角色通过协调各同事角色实现协作行为,因此必须依赖于各个同事角色。
  Colleague 同事角色
   --|每个同事角色都知道中介者角色,而且与其他同事角色通信时,一定要通过中介者角色协。
    同事类行为分为两种:
     --|自发行为(self-Method):一种同事本身的行为,例如改变对象本身的状态,处理自己的行为等。与其他同事类或中介者没有任何。
     --|依赖方法(Dep-Method):必须依赖中介者才能完成的行为。

public class MediatorTest {public static void main(String[] args) {//创建出中介者,并执行逻辑操作。Mediator mediator = new ConcreteMediator();mediator.setC1(new Colleague1(mediator));mediator.setC2(new Colleague2(mediator));mediator.doSomething1();}
}
abstract class Mediator{//定义同事类protected Colleague1 c1;protected Colleague2 c2;public Colleague1 getC1() {return c1;}public void setC1(Colleague1 c1) {this.c1 = c1;}public Colleague2 getC2() {return c2;}public void setC2(Colleague2 c2) {this.c2 = c2;}//中介者需要去完成的方法。public abstract void doSomething1();public abstract void doSomething2();
}
class ConcreteMediator extends Mediator{@Overridepublic void doSomething1() {//调用同事类的方法,只要是public的方法都可以调用。super.c1.depMethod();super.c2.depMethod();}@Overridepublic void doSomething2() {super.c1.selfMethod();super.c2.selfMethod();}}
abstract class Colleague{//同事类需要与其他同事类进行交互的,就交给中介者来处理。protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}
}
class Colleague1 extends Colleague{//通过构造函数,传递中介者。public Colleague1(Mediator mediator) {super(mediator);}public void selfMethod(){System.out.println("colleague1 所特有的方法...");}public void depMethod(){System.out.println("colleague1 需要中介者完成的方法...");}
}
class Colleague2 extends Colleague{//通过构造函数,传递中介者。public Colleague2(Mediator mediator) {super(mediator);}public void selfMethod(){System.out.println("colleague2 所特有的方法...");}public void depMethod(){System.out.println("colleague2  需要中介者完成的方法...");}
}

一个例子:

  一个公司有采购部门、销售部门、存货部门。他们之间存在着紧密的联系。
  采购部门(Purchase):根据销售情况、库存情况,负责采购不同的产品。
     --|void buyIBMComputer(int number)
     --|void refuseBuyIBM();
  销售部门(sale):销售部门要反馈销售情况,畅销就多采购,滞销就不采购。
    --|void sellIBMComputer(int number);
    --|int getSaleStatus();
    --|void offSale();
  存货部门(Stock):根据销售情况,已经自身库存的数量,决定是否需要采购。
    --|void increase(int number)
    --|void decrease(int number)
    --|int getStockNumber()
    --|void clearStock();
  中介者模式的优点:
  减少类间的依赖,把原有的一堆多的依赖变成了一对一的依赖,同事类只依赖中介者,减少了依赖。同时降低了类间的耦合。

public class MediatorT {public static void main(String[] args) {//创建中介者AbstractMediator mediator = new ComMediator();//销售者进行销售,100台电脑Sale sale = new Sale(mediator);sale.sellIBMComputer(100);//获取库存状态Stock stock = new Stock(mediator);System.out.println("库存状态.."+stock.getStock());//采购者进行采购Purchase purchase = new Purchase(mediator);purchase.buyIBMComputer(1000);//获取库存状态System.out.println("库存状态.."+stock.getStock());}
}
//抽象中介者类,用于将
abstract class AbstractMediator{//库存部门protected Stock stock = null;//销售部门protected Sale sale = null;//采购部门。protected Purchase purchase = null;public AbstractMediator() {this.sale = new Sale(this);this.purchase = new Purchase(this);this.stock = new Stock(this);}//定义一个中介者执行方法。共子类实现public abstract void execute(String type,Object ...objects);
}
class ComMediator extends AbstractMediator{@Overridepublic void execute(String type, Object... objects) {//采购电脑,销售电脑,折价销售电脑,清仓处理if(type.equalsIgnoreCase("purchase.buy")){this.buyIBMComputer((Integer)objects[0]);}else if(type.equalsIgnoreCase("sale.sell")){saleComputer((Integer)objects[0]);}else if(type.equalsIgnoreCase("sale.offSale")){offSell();}else if(type.equalsIgnoreCase("stock.clear")){clearStock();}}//清空仓库private void clearStock(){//清空仓库中的所有电脑。super.stock.clearStock();}//购买电脑private void buyIBMComputer(int number){//首先获取销售类,如果销售状态>80,就可以进行采购int saleStatus = super.sale.getSaleStatus();if(saleStatus > 80){super.purchase.buyIBMComputer(number);//购买完成后,库存增加一定的电脑super.stock.increase(number);}else{//效益不好,折半采购int buyNumber = number / 2;System.out.println("采购IBM电脑:"+buyNumber+"台.");super.stock.increase(buyNumber);}}//销售电脑private void saleComputer(int number){//检查库存量if(super.stock.getStock()<number){//库存量不足,通知采购电脑super.purchase.buyIBMComputer(number);}//将库存减去相应的电脑数super.stock.decrease(number);}//折半销售电脑private void offSell(){System.out.println("折半销售电脑:"+super.stock.getStock()+"台");}
}
abstract class AbstractColleague{//抽象的同事类,使得通过构造函数将中介者实例化protected AbstractMediator abstractMediator;public AbstractColleague(AbstractMediator abstractMediator){this.abstractMediator = abstractMediator;}
}
//库存部门
class Stock extends AbstractColleague{//库存默认有10台电脑。private static int 	COMPUTER_NUMBER = 100;public Stock(AbstractMediator abstractMediator) {super(abstractMediator);}//增加库存public void increase(int number){COMPUTER_NUMBER += number; }//获得库存量public int getStock(){return COMPUTER_NUMBER;}//减少库存public void decrease(int number){COMPUTER_NUMBER -= number;}//清空库存public void clearStock(){System.out.println("清空了仓库里的"+COMPUTER_NUMBER+"台电脑...");COMPUTER_NUMBER = 0;}
}
//销售部门
class Sale extends AbstractColleague{public Sale(AbstractMediator abstractMediator) {super(abstractMediator);}//购买电脑public void sellIBMComputer(int number){//通知中介者销售产品super.abstractMediator.execute("sale.sell", number);System.out.println("销售了"+number+"台电脑。");}//获取销售状态public int getSaleStatus(){//随机生成一个数字,表示销售状态Random random = new Random();int saleStatus = random.nextInt(100);return saleStatus;}//打折销售public void offSale(){//通知中介者打折销售super.abstractMediator.execute("sale.offSale");}
}
//采购部门
class Purchase extends AbstractColleague{public Purchase(AbstractMediator abstractMediator) {super(abstractMediator);}//购买电脑。属于同事类的自身方法。无需借助Mediator。public void buyIBMComputer(int number){//通知中介者,购买number台电脑。super.abstractMediator.execute("purchase.buy", number);}//拒绝购买电脑public void refuseBuyIBM(){System.out.println("拒绝购买电脑...");}
}


这篇关于设计模式(八)---中介者模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049548

相关文章

如何开启和关闭3GB模式

https://jingyan.baidu.com/article/4d58d5414dfc2f9dd4e9c082.html

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

十四、观察者模式与访问者模式详解

21.观察者模式 21.1.课程目标 1、 掌握观察者模式和访问者模式的应用场景。 2、 掌握观察者模式在具体业务场景中的应用。 3、 了解访问者模式的双分派。 4、 观察者模式和访问者模式的优、缺点。 21.2.内容定位 1、 有 Swing开发经验的人群更容易理解观察者模式。 2、 访问者模式被称为最复杂的设计模式。 21.3.观察者模式 观 察 者 模 式 ( Obser

从《深入设计模式》一书中学到的编程智慧

软件设计原则   优秀设计的特征   在开始学习实际的模式前,让我们来看看软件架构的设计过程,了解一下需要达成目标与需要尽量避免的陷阱。 代码复用 无论是开发何种软件产品,成本和时间都最重要的两个维度。较短的开发时间意味着可比竞争对手更早进入市场; 较低的开发成本意味着能够留出更多营销资金,因此能更广泛地覆盖潜在客户。 代码复用是减少开发成本时最常用的方式之一。其意图

Builder模式的实现

概念 在创建复杂对象时,将创建该对象的工作交给一个建造者,这个建造者就是一个Builder。在日常的开发中,常常看到,如下这些代码: AlertDialog的实现 AlertDialog.Builder builder = new AlertDialog.Builder(context);builder.setMessage("你好建造者");builder.setTitle

[分布式网络通讯框架]----ZooKeeper下载以及Linux环境下安装与单机模式部署(附带每一步截图)

首先进入apache官网 点击中间的see all Projects->Project List菜单项进入页面 找到zookeeper,进入 在Zookeeper主页的顶部点击菜单Project->Releases,进入Zookeeper发布版本信息页面,如下图: 找到需要下载的版本 进行下载既可,这里我已经下载过3.4.10,所以以下使用3.4.10进行演示其他的步骤。

《分析模式》“鸦脚”表示法起源,Everest、Barker和Hay

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《分析模式》这本书里面用的并不是UML表示法。作者Martin Fowler在书中也说了,该书写于1994-1995年,当时还没有UML。作者在书中用的是一种常被人称为“鸦脚”的表示法。  有的同学会有误解,例如有同学发表以下感想: “鸦脚”表示法当然不是Fowler先使用的。F

[最全]设计模式实战(一)UML六大原则

UML类图 UML类图是学习设计模式的基础,学习设计模式,主要关注六种关系。即:继承、实现、组合、聚合、依赖和关联。 UML类图基本用法 继承关系用空心三角形+实线来表示。实现接口用空心三角形+虚线来表示。eg:大雁是最能飞的,它实现了飞翔接口。 关联关系用实线箭头来表示。当一个类"知道"另一个类时,可以用关联。eg:企鹅需要"知道"气候的变化,需要"了解"气候规律。 聚合关

设计模式学习之中介者模式

我们平时写代码的过程,一个类必然会与其他类产生依赖关系,如果这种依赖关系如网状般错综复杂,那么必然会影响我们的代码逻辑以及执行效率,适当地使用中介者模式可以对这种依赖关系进行解耦使逻辑结构清晰,本篇博客,我们就一起学习中介者模式。 定义及使用场景 定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其