免責事項:この記事はブロガーオリジナル記事ですが、許可ブロガーなく再生してはなりません。https://blog.csdn.net/a770794164/article/details/90731094
一連のオブジェクト相互作用をカプセル化する中間オブジェクトと仲介モデル(メディエータ)。それは疎結合、独立して、それらの間の相互作用を変化させることができるようにオブジェクトを維持するメディエーターは、表示するためにお互いを指します。
例:
企業がWebサイトを行う必要があるが、彼が実行する時間を持っていなかった、あなたが委託する必要がある場合には、アウトソーシングが通常行うための会社を見つける必要があり、そして作られ、効果を確認するために進行を担当する管理会社、企業のアウトソーシングや管理会社を見つける必要があります会社が行う必要が、間の通信。このシナリオでは、仲介モードを達成するために使用することができます。
- 仲介抽象クラス
abstract class AbstractCompany {
AbstractMediator abstractMediator;
public AbstractCompany(AbstractMediator abstractMediator) {
this.abstractMediator = abstractMediator;
}
abstract void send(String content);
abstract void get(String msg);
}
- 庁の実装クラス
class ConcreteMediator extends AbstractMediator {
OutsourcedCompany outsourcedCompany;
SupervisionCompany supervisionCompany;
@Override
void send(String msg, AbstractCompany company) {
if (company instanceof OutsourcedCompany) {
System.out.println("中介收到来自外包公司的消息: " + msg + ",准备发送给监理公司");
if (supervisionCompany != null) {
supervisionCompany.get(msg);
}
} else if (company instanceof SupervisionCompany) {
System.out.println("中介收到来自监理公司的消息: " + msg + ",准备发送给外包公司");
if (outsourcedCompany != null) {
outsourcedCompany.get(msg);
}
}
}
public void setOutsourcedCompany(OutsourcedCompany outsourcedCompany) {
this.outsourcedCompany = outsourcedCompany;
}
public void setSupervisionCompany(SupervisionCompany supervisionCompany) {
this.supervisionCompany = supervisionCompany;
}
}
- 同僚抽象クラス
abstract class AbstractCompany {
AbstractMediator abstractMediator;
public AbstractCompany(AbstractMediator abstractMediator) {
this.abstractMediator = abstractMediator;
}
abstract void send(String content);
abstract void get(String msg);
}
- クラスを実装同僚抽象クラス
class OutsourcedCompany extends AbstractCompany {
public OutsourcedCompany(AbstractMediator abstractMediator) {
super(abstractMediator);
}
@Override
void send(String content) {
abstractMediator.send(content, this);
}
@Override
void get(String msg) {
System.out.println("外包公司收到消息:" + msg);
}
}
class SupervisionCompany extends AbstractCompany {
public SupervisionCompany(AbstractMediator abstractMediator) {
super(abstractMediator);
}
@Override
void send(String content) {
abstractMediator.send(content, this);
}
@Override
void get(String msg) {
System.out.println("监理公司收到消息:" + msg);
}
}
- メインプログラム
class Test {
public static void main(String[] args) {
ConcreteMediator myCompany = new ConcreteMediator();
OutsourcedCompany companyA = new OutsourcedCompany(myCompany);
SupervisionCompany companyB = new SupervisionCompany(myCompany);
myCompany.setOutsourcedCompany(companyA);
myCompany.setSupervisionCompany(companyB);
companyA.send("软件做完了,交给监理费检查吧!");
System.out.println("======");
companyB.send("检查完了,文档不够完善!");
}
}
结果:
中介收到来自外包公司的消息: 软件做完了,交给监理费检查吧!,准备发送给监理公司
监理公司收到消息:软件做完了,交给监理费检查吧!
======
中介收到来自监理公司的消息: 检查完了,文档不够完善!,准备发送给外包公司
外包公司收到消息:检查完了,文档不够完善!
要約:
メディエータ各カップリングは、同僚の出現を減少させ、そして独立抽象方法コラボレーション・オブジェクトので、各再利用同僚とメディエータークラスを変化させることが可能となり、中間独立概念としてオブジェクトにカプセル化され、その結果注目のオブジェクトがそれらの間の相互作用までの自分の行動の対象からシフトし、我々は、システム上のより広い視野に立っています。しかし、集中制御ConcreteMediatorに、そして相互作用の複雑さは、任意のメディエータがクラスConcreteColleague複合体よりも大きくなる可能メディエータ、複雑になり置きます。だから、仲介モデルは、一般に、通信機会の明確に定義されたが、複雑な方法のセットに適用し、複数のクラスに分散の動作をカスタマイズしたいのですが、機会があまりにも多くのサブカテゴリーを生成する必要はありません。