「デザインパターン」(メディエーターパターン/メディエーターパターン)

1.はじめに_

私たちの生活には、家を借りるとき、買うとき、仕事を見つけるとき、旅行するときなど、さまざまな場面で仲介業者の助けが必要になることがあります。それはさまざまな理由で起こります。そのような利益に基づいて同盟や敵を形成するために、国家間の関係も利益によって時間や環境によって変化します。地球上で最大の仲介者は国連であり、主に維持するために使用されます。国際の平和と安全。経済、社会、文化、人道的な国際問題を解決します。ソフトウェアの開発プロセスも同様で、オブジェクト間には強固で複雑な関係が存在し、国連のような「組織」が存在しないと、次のような問題が発生しやすくなります。

  • (1)システムの構造は非常に複雑になっており、オブジェクト間の関係が多数存在するため、オブジェクトが変更されると、それに関連付けられたオブジェクトもそれに応じて処理する必要があります。
  • (2) オブジェクト間の接続が増加すると、オブジェクトの再利用性が低下します。
  • (3)システムのスケーラビリティが低い新しいオブジェクトを追加するには、それに関連付けられたオブジェクトへの参照を追加する必要があるため、システムの結合が増加し、システムの柔軟性とスケーラビリティが低下します。

2 つのクラスが相互に通信する必要がない場合、2 つのクラスは直接関係する必要はありません。あるクラスが別のクラスのメソッドを呼び出す必要がある場合は、サードパーティを通じて呼び出しを転送できます。したがって、より複雑な関係を持つシステムの場合、オブジェクト間の相関を減らし、疎結合システムにするために、メディエーター パターンを使用する必要があります。

2. 中間モデルとは何ですか?

メディエーター パターンは、メディエーター オブジェクトを介した一連のオブジェクトの相互作用をカプセル化し、オブジェクト間の関係の複雑なネットワーク構造を、メディエーターを核とする単純なスター型構造に変換します。 -one 関係: 単一の関連付けにより、オブジェクト間の関係が単純化され、理解を容易にします。各オブジェクト間の関係は分離され、各オブジェクトは関連付けられたオブジェクトと直接対話しなくなり、中間オブジェクトを介して関連付けられたオブジェクトと対話します。通信により、オブジェクトは次のことを行うことができます。比較的独立して使用できるため、オブジェクトの再利用性とシステムのスケーラビリティが向上します。

メディエーター パターンでは、メディエーター クラスが中心であり、システム内のすべてのオブジェクト クラス間の関係をカプセル化します。オブジェクト間の関係を簡素化するだけでなく、オブジェクト間の相互作用をさらに制御することもできます。

3. UML構造図

Mediator: 抽象メディエーター、同僚オブジェクトとメディエーター オブジェクト間のインターフェイスを定義します。ConcreteMediator
: 具象メディエーター、抽象メディエーターのメソッドを実装します。すべての特定の同僚クラスを認識する必要があり、特定の同僚クラスから情報を受信する必要があります。他の具象同僚クラスへの情報
同僚: 抽象同僚クラス
ConcreteColleague: 具象同僚クラス 各具象同僚クラスはそれ自体の動作を知る必要があるだけですが、すべてが仲介者を知る必要があります。

UML 構造クラス図から、システム内で中間クラスが主に転送と調整という 2 つの側面を担当していることがわかります。

  • 構造的には中継の役割を果たします。メディエーター クラスによる関係のカプセル化により、オブジェクト クラスは他のオブジェクトを明示的に参照する必要がなくなり、メディエーターを介してのみ他のオブジェクト クラスと通信できるようになります。
  • 動作において調整の役割を果たします。メディエーター クラスによる関係のカプセル化を通じて、オブジェクト クラスは、他のオブジェクトを認識することなく、メディエーターを介して他のオブジェクトとの通信を完了できます。このプロセスでは、オブジェクト クラスはメディエータに何をすべきかを指示する必要はなく、メディエータは独自のロジックに従って調整し、同僚のリクエストをさらに処理し、同僚のメンバー間の関係動作を分離してカプセル化することができます。

ただし、中間オブジェクトはオブジェクト間の関係をカプセル化するため、中間オブジェクトが大きくなり、より複雑になります。また、より多くの責任を負い、維持がより困難になります。各オブジェクトとオブジェクト間の相互作用を把握する必要があります。詳細がある場合は、問題が発生すると、システム全体が問題になります。 

最後に、メディエーター モデルは比較的悪用されやすいため、複雑な「多対多」の対話型関係グループがシステムに現れた場合でも、急いでメディエーター モデルを使用しないでください。それは設計上合理的ですか?

4. コードの実装

家を借りる場合を例に挙げると、仲介業者は借り手と家の所有者との間の仲介役を務めます。

1 つ目は抽象メディエーターです: Mediator.java

public abstract class Mediator {
    //申明一个联络方法
    public abstract void constact(String message,Person person);
}

 次に、抽象同僚オブジェクト: Person.java があります。

public class HouseOwner extends Person{
 
    HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }
    
    /**
     * @desc 与中介者联系
     * @param message
     * @return void
     */
    public void constact(String message){
        mediator.constact(message, this);
    }
 
    /**
     * @desc 获取信息
     * @param message
     * @return void
     */
    public void getMessage(String message){
        System.out.println("房主:" + name +",获得信息:" + message);
    }
}

テナント.java

public class Tenant extends Person{
    
    Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }
    
    /**
     * @desc 与中介者联系
     * @param message
     * @return void
     */
    public void constact(String message){
        mediator.constact(message, this);
    }
 
    /**
     * @desc 获取信息
     * @param message
     * @return void
     */
    public void getMessage(String message){
        System.out.println("租房者:" + name +",获得信息:" + message);
    }
}

特定のメディエーター オブジェクト: メディエーター構造体、MediatorStructure.java

public class MediatorStructure extends Mediator{
    //首先中介结构必须知道所有房主和租房者的信息
    private HouseOwner houseOwner;
    private Tenant tenant;
 
    public HouseOwner getHouseOwner() {
        return houseOwner;
    }
 
    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }
 
    public Tenant getTenant() {
        return tenant;
    }
 
    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }
 
    public void constact(String message, Person person) {
        if(person == houseOwner){          //如果是房主,则租房者获得信息
            tenant.getMessage(message);
        }
        else{       //反之则是获得房主信息
            houseOwner.getMessage(message);
        }
    }
}

クライアント: Client.java

public class Client {
    public static void main(String[] args) {
        //一个房主、一个租房者、一个中介机构
        MediatorStructure mediator = new MediatorStructure();
        
        //房主和租房者只需要知道中介机构即可
        HouseOwner houseOwner = new HouseOwner("张三", mediator);
        Tenant tenant = new Tenant("李四", mediator);
        
        //中介结构要知道房主和租房者
        mediator.setHouseOwner(houseOwner);
        mediator.setTenant(tenant);
        
        tenant.constact("听说你那里有三室的房主出租.....");
        houseOwner.constact("是的!请问你需要租吗?");
    }
}

操作結果:

家主: Zhang San、情報を入手: 3 ベッドルームの賃貸住宅があると聞きました... 
借主: Li Si、情報を入手: はい! 借りる必要がありますか?  

参考記事アドレス:  Behavioral Java Design Pattern: Mediator Pattern_Zhang Weipeng's Blog-CSDN Blog_java Mediator Pattern

おすすめ

転載: blog.csdn.net/m0_50370837/article/details/126254131