デザインパターン9:仲介モデル(メディエータ)

実生活では、多くの場合、それは多くのオブジェクト間の複雑な相互作用がある表示され、このような相互作用は、多くの場合、各オブジェクトは、それがオブジェクトと対話する必要があることを知らなければならないことを要求し、「ネットワーク」、です。例えば、それぞれの人が彼(彼女)すべての電話の友人を覚えておく必要があります。変更した場合、彼(彼女)は、すべての他の友人の変更を通知しなければならない。また、誰かの携帯電話で友人が、これは「全体としての状況に影響を与える」と呼ばれています、それは非常に複雑です。

「スター構造」に、このようなA「ネットワーク」は、それは非常にそれらの間の「結合」削減する場合は、単に「仲介者」それを見つけます。以前に述べたように、インターネットにアクセスすることができ、それぞれの友人が解か「アドレス帳」の問題、限り成立「誰もがすべての私の友人が呼び出す忘れてはなりません」。彼は仕事を見つけるためだけの奇妙な都市を持っていたこと、あなたがヘルプに「人材交流センター」を見つけることができる、または、多くのそのような例は、たとえば、あなただけの、あなたは「不動産業者」を見つけることができますSHENLIBAOの口の仕事を借りたい、があります。

ソフトウェア開発プロセスでは、多くのそのような例があり、例えば、MVCフレームワークでは、コントローラ(C)は、モデル(M)と中間のビュー(V)であり、「調停者らは、QQのチャットプログラムを使用しました誰が「QQサーバーです。このすべてを使用することができる「中間モデルが」実装され、それは大きく、システムの柔軟性を高め、オブジェクト間の結合を減少させます。

モデルの定義と特性

定義されたメディエータ(メディエータ)モード:一連のオブジェクト間の相互作用の定義をカプセル化する仲介オブジェクト、元の緩いオブジェクトとの間の結合、および独立してそれらの間の相互作用を変化させることができます。仲介モデルは、デメテルの法則の典型的なアプリケーションであるメディエーションモデルと呼ばれます。

メディエーターオブジェクト行動パターンがパターンで、主な利点は次の通りです。

  1. オブジェクト、容易に独立に多重化されたオブジェクトとの間の結合を減少させます。
  2. 1つの関連にオブジェクト間の多くの関連付けは維持し、拡張するシステムを容易にする、システムの柔軟性を向上させることができます。


その主な欠点がある:あまりにも多くの責任のような同僚は偉大なメディエーターであることになるとき、それは維持するために、そのシステムは難しく複雑で大きくなります。

アーキテクチャと実装モデル

達成するための重要な仲介モデルは、「仲介者」、その分析の次のような構造と実装を見つけることです。

1.構造モデル

仲介モデルは、次の主要な役割で構成されています。

  1. 抽象メディエータ(メディエータ)の役割:それは仲介者インタフェースは抽象オブジェクト登録と転送方式同僚同僚オブジェクトの情報を提供しています。
  2. 特定メディエータ(ConcreteMediator)の役割:それは同僚の役割に依存するようにメディエータが、インターフェースを実装するオブジェクトを管理するために、同僚のリストを定義し、様々な役割の同僚との間の相互作用を調整します。
  3. 同僚抽象クラス(同僚)の役割:インターフェースのような同僚の定義は、抽象メソッドの同僚のオブジェクト相互作用を提供し、各他の全ての影響のような共通の機能の同僚を達成する中間オブジェクトを保存します。
  4. 同僚特定のクラス(コンクリート同僚)の役割は:あなたが仲介オブジェクトによって、他のオブジェクトの同僚と対話する必要があり、実装同僚が、その後の相互作用に関与することを抽象クラスです。


図1に示されている図仲介モデル構造。
 

                 Mediatorパターンの構成図

実現の2モード

次のように中間のモデルコードは次のとおりです。

package mediator;
import java.util.*;
public class MediatorPattern
{
    public static void main(String[] args)
    {
        Mediator md=new ConcreteMediator();
        Colleague c1,c2;
        c1=new ConcreteColleague1();
        c2=new ConcreteColleague2();
        md.register(c1);
        md.register(c2);
        c1.send();
        System.out.println("-------------");
        c2.send();
    }
}
//抽象中介者
abstract class Mediator
{
    public abstract void register(Colleague colleague);
    public abstract void relay(Colleague cl); //转发
}
//具体中介者
class ConcreteMediator extends Mediator
{
    private List<Colleague> colleagues=new ArrayList<Colleague>();
    public void register(Colleague colleague)
    {
        if(!colleagues.contains(colleague))
        {
            colleagues.add(colleague);
            colleague.setMedium(this);
        }
    }
    public void relay(Colleague cl)
    {
        for(Colleague ob:colleagues)
        {
            if(!ob.equals(cl))
            {
                ((Colleague)ob).receive();
            }   
        }
    }
}
//抽象同事类
abstract class Colleague
{
    protected Mediator mediator;
    public void setMedium(Mediator mediator)
    {
        this.mediator=mediator;
    }   
    public abstract void receive();   
    public abstract void send();
}
//具体同事类
class ConcreteColleague1 extends Colleague
{
    public void receive()
    {
        System.out.println("具体同事类1收到请求。");
    }   
    public void send()
    {
        System.out.println("具体同事类1发出请求。");
        mediator.relay(this); //请中介者转发
    }
}
//具体同事类
class ConcreteColleague2 extends Colleague
{
    public void receive()
    {
        System.out.println("具体同事类2收到请求。");
    }   
    public void send()
    {
        System.out.println("具体同事类2发出请求。");
        mediator.relay(this); //请中介者转发
    }
}

次のようにプログラムの動作結果は以下のとおりです。 

具体同事类1发出请求。
具体同事类2收到请求。
-------------
具体同事类2发出请求。
具体同事类1收到请求。

応用例のモード

〔実施例1〕書か仲介モデル「不動産交換プラットフォーム韶関市」プログラム。

説明:韶関市の不動産プラットフォームが使用仲介モデルは達成するために、より適した「ベンダーの顧客」と「バイサイドの顧客の情報交換プラットフォームは、「不動産会社」です。

まず、抽象的な仲介ある仲介会社(ミディアム)インタフェースの定義は、それが(文字列から、文字列の広告)顧客登録方法・レジスタ(カスタマー・メンバー)との情報転送方式のリレーが含まれています 。 その後、韶関市の不動産を定義します(EstateMedium)顧客リストオブジェクト格納されている情報、および実装機関抽象メソッドが含まれている特定のメディエータークラスです会社。

次いで、含ま抽象同僚クラスである顧客(Qistomer)クラスの定義は、メディエータ、および送信送信情報(文字列AD)をオブジェクトがあるため、インタフェースメソッド(Stringadから文字列)の情報を受信する方法を受信しますこの手順は、ウィンドウプロシージャ、本JPmmeクラス継承するクラス、およびアクションイベント処理方法のactionPerformed実装(のActionEvent E)です。

最後に、特定の同僚のクラスであり、売り手の定義(売主)カテゴリと買い手(バイヤー)クラスは、親クラスで抽象メソッドを実装し、顧客(顧客)クラス、そのような仲介者を通じての情報交換のサブクラスであります図2に示す構成。
 

                不動産交換プラットフォームの韶関ブロック図


コードは以下の通りであります:

package mediator;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class DatingPlatform
{
    public static void main(String[] args)
    {
        Medium md=new EstateMedium();    //房产中介
        Customer member1,member2;
        member1=new Seller("张三(卖方)");
        member2=new Buyer("李四(买方)");
        md.register(member1); //客户注册
        md.register(member2);
    }
}
//抽象中介者:中介公司
interface Medium
{
    void register(Customer member); //客户注册
    void relay(String from,String ad); //转发
}
//具体中介者:房地产中介
class EstateMedium implements Medium
{
    private List<Customer> members=new ArrayList<Customer>();   
    public void register(Customer member)
    {
        if(!members.contains(member))
        {
            members.add(member);
            member.setMedium(this);
        }
    }   
    public void relay(String from,String ad)
    {
        for(Customer ob:members)
        {
            String name=ob.getName();
            if(!name.equals(from))
            {
                ((Customer)ob).receive(from,ad);
            }   
        }
    }
}
//抽象同事类:客户
abstract class Customer extends JFrame implements  ActionListener
{
    private static final long serialVersionUID=-7219939540794786080L;
    protected Medium medium;
    protected String name;   
    JTextField SentText;
    JTextArea ReceiveArea;   
    public Customer(String name)
    {
        super(name);
        this.name=name;       
    }
    void ClientWindow(int x,int y)
    {       
        Container cp;        
        JScrollPane sp;
        JPanel p1,p2;        
        cp=this.getContentPane();       
        SentText=new JTextField(18);
        ReceiveArea=new JTextArea(10,18);
        ReceiveArea.setEditable(false);
        p1=new JPanel();
        p1.setBorder(BorderFactory.createTitledBorder("接收内容:"));       
        p1.add(ReceiveArea);
        sp=new JScrollPane(p1);
        cp.add(sp,BorderLayout.NORTH);        
        p2=new JPanel();
        p2.setBorder(BorderFactory.createTitledBorder("发送内容:"));       
        p2.add(SentText);   
        cp.add(p2,BorderLayout.SOUTH);       
        SentText.addActionListener(this);       
        this.setLocation(x,y);
        this.setSize(250, 330);
        this.setResizable(false); //窗口大小不可调整
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);      
        this.setVisible(true);       
    }
    public void actionPerformed(ActionEvent e)
    {
        String tempInfo=SentText.getText().trim();
        SentText.setText("");
        this.send(tempInfo);
    }
    public String getName()
    {    return name;   }
    public void setMedium(Medium medium)
    {      this.medium=medium;  }   
    public abstract void send(String ad);
    public abstract void receive(String from,String ad);
}
//具体同事类:卖方
class Seller extends Customer
{
    private static final long serialVersionUID=-1443076716629516027L;
    public Seller(String name)
    {
        super(name);
        ClientWindow(50,100);
    }   
    public void send(String ad)
    {
        ReceiveArea.append("我(卖方)说: "+ad+"\n");
        //使滚动条滚动到最底端
        ReceiveArea.setCaretPosition(ReceiveArea.getText().length());
        medium.relay(name,ad);
    }
    public void receive(String from,String ad)
    {
        ReceiveArea.append(from +"说: "+ad+"\n");
        //使滚动条滚动到最底端
        ReceiveArea.setCaretPosition(ReceiveArea.getText().length());
    }
}
//具体同事类:买方
class Buyer extends Customer
{
    private static final long serialVersionUID = -474879276076308825L;
    public Buyer(String name)
    {
        super(name);
        ClientWindow(350,100);
    }   
    public void send(String ad)
    {
        ReceiveArea.append("我(买方)说: "+ad+"\n");
        //使滚动条滚动到最底端
        ReceiveArea.setCaretPosition(ReceiveArea.getText().length());
        medium.relay(name,ad);
    }
    public void receive(String from,String ad)
    {
          ReceiveArea.append(from +"说: "+ad+"\n");
        //使滚动条滚动到最底端
        ReceiveArea.setCaretPosition(ReceiveArea.getText().length());
    }
}

図1に示すプログラムの結果を実行します。
 

                       不動産交換プラットフォームの韶関業績

シーンモードの応用

以下のシナリオを分析し、仲介モデルの構造と機能の以前の分析。

  • オブジェクト間の複雑な構造関係は依存引き起こした混乱をメッシュし、再利用することは困難がある場合。
  • あなたは、複数のクラス間でオブジェクトの実行を作成したい場合は、新しいサブクラスを生成する必要はありません。

拡張モード

実際の開発では、次の2つの方法が通常の開発が容易仲介モデルを単純化するために用いられます。

  1. インタフェース仲介は、単メディエーターの実施例として、特定のオブジェクトインプリメンテーションを定義されていません。
  2. 同僚のオブジェクトは、仲介者を保持しますが、必要なときにオブジェクトを運ぶと、fを呼び出す仲介者に直接アクセスしません。


図4は、中間モデルの簡略化したブロック図です。
 

                   仲介モデルの簡略化したブロック図


コードは以下の通りであります:

package mediator;
import java.util.*;
public class SimpleMediatorPattern
{
    public static void main(String[] args)
    {
        SimpleColleague c1,c2;
        c1=new SimpleConcreteColleague1();
        c2=new SimpleConcreteColleague2();
        c1.send();
        System.out.println("-----------------");
        c2.send();
    }
}
//简单单例中介者
class SimpleMediator
{
    private static SimpleMediator smd=new SimpleMediator();   
    private List<SimpleColleague> colleagues=new ArrayList<SimpleColleague>();   
    private SimpleMediator(){}   
    public static SimpleMediator getMedium()
    {    return(smd);   }
    public void register(SimpleColleague colleague)
    {
        if(!colleagues.contains(colleague))
        {
            colleagues.add(colleague);
        }
    }
    public void relay(SimpleColleague scl)
    {       
        for(SimpleColleague ob:colleagues)
        {
            if(!ob.equals(scl))
            {
                ((SimpleColleague)ob).receive();
            }   
        }
    }
}
//抽象同事类
interface SimpleColleague
{
    void receive();   
    void send();
}
//具体同事类
class SimpleConcreteColleague1 implements SimpleColleague
{
    SimpleConcreteColleague1(){
        SimpleMediator smd=SimpleMediator.getMedium();
        smd.register(this);
    }
    public void receive()
    {    System.out.println("具体同事类1:收到请求。");    }   
    public void send()
    {
        SimpleMediator smd=SimpleMediator.getMedium();
        System.out.println("具体同事类1:发出请求...");
        smd.relay(this); //请中介者转发
    }
}
//具体同事类
class SimpleConcreteColleague2 implements SimpleColleague
{
    SimpleConcreteColleague2(){
        SimpleMediator smd=SimpleMediator.getMedium();
        smd.register(this);
    }
    public void receive()
    {    System.out.println("具体同事类2:收到请求。");    }   
    public void send()
    {
        SimpleMediator smd=SimpleMediator.getMedium();
        System.out.println("具体同事类2:发出请求...");
        smd.relay(this); //请中介者转发
    }
}

次のようにプログラムの結果は以下のとおりです。 

具体同事类1:发出请求...
具体同事类2:收到请求。
-----------------
具体同事类2:发出请求...
具体同事类1:收到请求。

 

出版136元記事 ウォンの賞賛6 ビュー1540

おすすめ

転載: blog.csdn.net/weixin_42073629/article/details/104437879