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

  • 相关阅读:
    Selenium-Xpath使用方法
    HTML基础之js
    HTML基础—DOM操作
    CSS基础知识总结二
    CSS基础知识总结之css样式引用的三种方式
    BZOJ 2329/2209 [HNOI2011]括号修复 (splay)
    BZOJ 1576 [USACO]安全路经Travel (树剖+线段树)
    BZOJ 2402 陶陶的难题II (01分数规划+树剖+线段树+凸包+二分)
    BZOJ 4044 Virus synthesis (回文自动机+dp)
    BZOJ 2342 [SHOI2011]双倍回文 (回文自动机)
  • 原文地址:https://www.cnblogs.com/wxisme/p/4546723.html
Copyright © 2011-2022 走看看