zoukankan      html  css  js  c++  java
  • 设计模式——中介者模式

    中介者模式:如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量的多对多关系,将导致关系及其复杂,这些对象称为“同事对象”,

                     我们可以引入一个中介者对象使各个同时对象只跟中介者对象打交道。将复杂的网络结构化解为如下的星形结构。使用中介者模式来

                     集中相关对象之间复杂的沟通和控制方式。

    优点:  通过将对象的解耦增加对象的可复用性。
               通过控制逻辑集中,可以简化系统维护。

    应用场景:GUI开发中的window对象或DOM对象。
                  MVC模式中的Control部分也是中介者,是Modle和View的中介。

    但是在实际开发中如果各个"同事对象"之间的关系不是特别复杂,就没有必要用中介者模式,会增加代码的复杂度,而且中介者模式的有点也体现不出来。

    下面的Demo只是演示,如果像下面这样简单的关系就没有必要用中介者模式。

    Demo用的是面向继承而不是面向接口,这不违反面向接口编程的设计原则,因为在下面这种情况下,使用继承会有更好的代码复用度,更好的运用多态。

    例子很简单,很容易看明白。

    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 中介者
     * @author wxisme
     *
     */
    abstract class Mediator {
    	protected Map<String,Colleague> map = new HashMap<String , Colleague>();
    	
    	public void addColleague(String name, Colleague colleague) {
    		colleague.setMediator(this);
    		map.put(name, colleague);
    	}
    	
    	public void removeColleague(String name) {
    		map.remove(name);
    	}
    	
    	public abstract void execute(String name, String method);
    
    }
    
    class ConcreteMediator extends Mediator {
    	@Override
    	public void execute(String name, String method) {
    		if(name.equals("ConcretColleagueA")) {
    			if(method.equals("self")) {
    				this.map.get(name).self();
    			}
    			else {
    				this.map.get(name).out();
    			}
    		}
    		else {
    			if(method.equals("self")) {
    				this.map.get(name).self();
    			}
    			else {
    				this.map.get(name).out();
    			}
    		}
    	}
    }
    
    /**
     * 同事类
     * @author wxisme
     *
     */
    
    abstract class Colleague {
    	
    	protected Mediator mediator;
    	
    	public void setMediator(Mediator mediator) {
    		this.mediator = mediator;
    	}
    	
    	public abstract void self();
    	public abstract void out();
    
    }
    
    class ConcretColleagueA extends Colleague {
    	
    	public void self() {
    		System.out.println("A doing self things.");
    	}
    	
    	public void out() {
    		System.out.println("A cooperate with other Colleague.");
    	}
    	
    }
    
    class ConcretColleagueB extends Colleague {
    	
    	public void self() {
    		System.out.println("B doing self things.");
    	}
    	
    	public void out() {
    		System.out.println("B cooperate with other Colleague.");
    	}
    	
    }
    
    public class Client {
    	public static void main(String[] args) {
    		Mediator mediator = new ConcreteMediator();
    		
    		Colleague colleagueA = new ConcretColleagueA();
    		mediator.addColleague("ConcretColleagueA", colleagueA);
    		Colleague colleagueB = new ConcretColleagueB();
    		mediator.addColleague("ConcretColleagueB", colleagueB);
    		
    		colleagueA.self();
    		colleagueA.out();
    		System.out.println("Finish job");
    		colleagueB.self();
    		colleagueB.out();
    		System.out.println("Finish job");
    		
    		
    	}
    }
    

     运行结果:

    A doing self things.
    A cooperate with other Colleague.
    Finish job
    B doing self things.
    B cooperate with other Colleague.
    Finish job

  • 相关阅读:
    牛客IOI周赛17-提高组 卷积 生成函数 多项式求逆 数列通项公式
    6.3 省选模拟赛 Decompose 动态dp 树链剖分 set
    AtCoder Grand Contest 044 A Pay to Win 贪心
    5.29 省选模拟赛 树的染色 dp 最优性优化
    luogu P6097 子集卷积 FST FWT
    CF724C Ray Tracing 扩展欧几里得 平面展开
    5.30 省选模拟赛 方格操作 扫描线 特殊性质
    5.29 省选模拟赛 波波老师 SAM 线段树 单调队列 并查集
    Spring main方法中怎么调用Dao层和Service层的方法
    Bug -- WebService报错(两个类具有相同的 XML 类型名称 "{http://webService.com/}getPriceResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。)
  • 原文地址:https://www.cnblogs.com/wxisme/p/4546723.html
Copyright © 2011-2022 走看看