网状结构的解藕-中介者模式

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

(#)适用场景如下:

从图一变换成图二以后,系统整体变得很清晰,而且对于中间过程在中介中进行封装,很容易进行扩展、

(#)TALK IS CHEEP    场景:如图二

1.首先我定义一下抽象的同事协作类

public class AbstractColleague {
    protected AbstractMediator mediator;

    public AbstractColleague(AbstractMediator mediator) {
        this.mediator = mediator;
    }

}

接下来定义他的三个具体的实现类

/**
 * 采购
 * Author: scw
 * Time: 16-12-28
 */
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");
    }
}

/**
 * 库存
 * Author: scw
 * Time: 16-12-28
 */
public class Stock extends AbstractColleague {
    public Stock(AbstractMediator mediator) {
        super(mediator);
    }

    private static int COMPUTER_NUM=100;

    public void  increase(int num){
        COMPUTER_NUM+=num;
        System.out.println("电脑库存="+COMPUTER_NUM);
    }

    public void decrease(int num){
        COMPUTER_NUM-=num;
        System.out.println("电脑库存="+COMPUTER_NUM);
    }

    public int getStockNumber(){
        return COMPUTER_NUM;
    }

    public void clearStock(){
        System.out.println("清理存货数量为:"+COMPUTER_NUM);
        super.mediator.execute("stock.clear");
    }
}

/**
 * 销售
 * Author: scw
 * Time: 16-12-28
 */
public class Sale extends AbstractColleague {
    public Sale(AbstractMediator mediator) {
        super(mediator);
    }

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

    public int getSaleStatus(){
        int saleStatus = new Random(System.currentTimeMillis()).nextInt(100);
        System.out.println("IBM电脑销售:"+saleStatus);
        return saleStatus;
    }

    public void offrSale(){
        super.mediator.execute("sale.offSell");
    }
}

2.接下来定义抽象的中介者

/**
 * Author: scw
 * Time: 16-12-28
 */
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);
}

注意其中使用的比较巧妙的就是抽象的execute方法,其中使用...,对于参数进行了一个动态的变换

3.剩下的就是具体的具体的中介实现

/**
 * 具体的中介
 * Author: scw
 * Time: 16-12-28ju
 */
public class Mediator extends AbstractMediator {
    @Override
    public void execute(String str, Object... objects) {
        if(StringUtils.contains(str,"purchase.buy")){
            this.buyComputer((Integer) objects[0]);
        }else if (StringUtils.contains(str,"sale.sell")){
            this.sellComputer((Integer) objects[0]);
        }else if(StringUtils.contains(str,"sale.offSell")){
            this.offSell();
        }else{
            this.clearStock();
        }
    }

    private void buyComputer(int num){
        int saleStatus = super.sale.getSaleStatus();
        if(saleStatus>70){
            System.out.println("销售良好采购IBM电脑:"+saleStatus);
        }else {
            num = num/2;
            System.out.println("销售不好采购IBM电脑:"+saleStatus);

        }
        super.stock.increase(num);
    }

    private void sellComputer(int num){
        if(super.stock.getStockNumber()<num){
            super.purchase.buyIBMcomputer(num);
        }
        super.stock.increase(num);
    }

    private void offSell(){
        System.out.println("折价销售电脑"+stock.getStockNumber());
    }

    private void clearStock(){
        super.sale.offrSale();
        super.purchase.refuseBuyIBM();
    }
}

(#)总结,对于上面代码的理解就是:中介持有所有要组合使用的对象,然后当单独调用的一个其中的步奏的时候,回调中介的execute方法,在中介中对于这些不走

进行组装拼接.ok,但是请注意,中介者的缺点是中介者可能膨胀的很大,关系越多那么越复杂,所以注意使用的场景,就比如上图,当各个操作出现一个网状结构的时候,

很适合使用这种模式

时间: 2024-10-16 19:01:10

网状结构的解藕-中介者模式的相关文章

第19章 行为型模式—中介者模式

1. 中介者模式(Mediator Pattern)的定义 (1)定义:用一个中介对象来封装一系统对象交互.中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.       ①中介者模式主要用来将同事类之间网状结构变为星状结构,使同事类之间的关系变的清晰一些. ②所有对象只跟中介者对象进行通信,相互之间不再有联系,这样也能够集中控制这些对象的交互关系. (2)中介者模式的结构和说明 ①Mediator: 中介者接口.在里面定义各个同事之间交互需要的方法,可以

中介者模式(Mediator)

一.中介者模式介绍 中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用.从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式核心:1.就是将网状结构处理成星型结构      2.将多对多处理成一对多 例如:世界上各个国家的和平和安全,沟通和交流等等问题,如果各个国家都可以互相交互的话,容易造成混乱,关系复杂. 这个时候联合国的作用就出现了,联合国作为一个中介对象来维护各个国家的和平和安全等等的工作. 中介者模式UML图: 例如:公司中如果没有部门经理

【设计模式】中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. 介绍 意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理. 何

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

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

行为型模式之中介者模式

概述 如果在一个系统中对象之间存在多对多的相互关系,可以将对象之间的一些交互行为从各个对象中分离出来,并集中封装在一个中介者对象中,并由该中介者进行统一协调,这样对象之间多对多的复杂关系就转化为相对简单的一对多关系.通过引入中介者来简化对象之间的复杂交互,中介者模式是“迪米特法则”的一个典型应用. 定义 中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式

设计模式之中介者模式

中介者模式 定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 类图: 中介者模式结构:抽象中介者.中介者实现.同事类 使用中介者模式的原因: 多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构 如果引入中介者模式,那么同事类之间的关系将变为星型结构,同事只和中介者有关系,而中介者处理这些就同事之间的关系 中介者模式的优点 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使

设计模式学习总结(23) 中介者模式

本系列主要记录设计模式的意图是什么,它要解决一个什么问题,什么时候可以使用它:它是怎样解决的,掌握它的结构图,记住它的关键代码:可以想到至少两个它的应用实例,一个生活中的,一个软件中的:这个模式的优缺点是什么,其有哪些使用场景,在使用时要注意什么. 尊重作者,转载请注明晔阳的Bloghttp://blog.csdn.net/hacke2 23.中介者模式 意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不须要显式地相互引用,从而使其耦合松散,并且能够独立地改变它们之间的交互. 主要解决

大话设计模式—中介者模式

中介者模式(Mediator Pattern)是用来减少多个对象和类之间的通信复杂性. 这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合.使代码易于维护. 中介者模式属于行为型模式. 引言: 虽然一个系统切割成很多对象通常能够添加其可复用性.可是对象间相互连接次数的添加又会减少其可复用性:大量的连接使得一个对象不可能在没有其它对象的支持下工作.系统表现为一个不可切割的总体,所以,对系统的行为进行不论什么较大的修改就十分困难了. 要解决这种问题.我们能够使用 迪米特原则 ,假设

24种设计模式--中介者模式【Mediator Pattern】

各位好,大家都是来自五湖四海,都要生存,于是都找了个靠山——公司,给你发薪水的地方,那公司就要想尽办法盈利赚钱,盈利方法则不尽相同,但是作为公司都有相同三个环节:采购.销售和库存,这个怎么说呢?比如一个软件公司,要开发软件,需要开发环境吧, Windows 操作系统,数据库产品等,这你得买吧,那就是采购,开发完毕一个产品还要把产品推销出去,推销出去了大家才有钱赚,不推销出去大家都去喝西北风呀,既然有产品就必然有库存,软件产品也有库存,你总要拷贝吧,虽然是不需要占用库房空间,那也是要占用光盘或硬盘