정의 : 중재자 객체와 일련의 객체 상호 작용을 캡슐화합니다. 중재자는 각 객체가 디스플레이없이 상호 작용하여 커플 링을 풀고 그들 사이의 상호 작용을 독립적으로 변경하게합니다.
유형 : 행동 클래스 패턴 클래스 다이어그램 :
중개 모델의 구조
중개 모드를 중재자 모드라고도합니다. 클래스 다이어그램에서 3 부분으로 나뉩니다.
초록 중재자 : 동료 클래스 객체와 중재자 객체 사이의 인터페이스를 정의하고 각 동료 클래스 간의 커뮤니케이션에 사용됩니다. 일반적으로 하나 또는 여러 개의 추상 이벤트 방법을 포함하며 서브 클래스로 구현됩니다.
중개 구현 클래스 : 추상 중재자로부터 상속 및 추상 중재자에 정의 된 이벤트 방법을 구현합니다. 한 동료 수업에서 메시지를받은 다음 메시지를 통해 다른 동시 클래스에 영향을 미칩니다.
동료 클래스 : 객체가 다른 객체에 영향을 미치고 다른 객체의 영향을받는 경우이 두 객체를 동료 클래스라고합니다. 클래스 다이어그램에는 동료 수업이 하나 뿐이며 실제로는 현실의 생략입니다. 실제 응용 분야에서 동료 수업은 일반적으로 다수로 구성되며 서로 영향을 미치고 의존합니다. 동료가 많을수록 관계가 더 복잡해집니다. 또한 동료 클래스는 동일한 추상 클래스를 상속하는 일련의 구현으로 표시 될 수 있습니다. 중개 모델에서 메시지는 동료들 사이의 중개자를 통해 전송되어야합니다.
중개 모델을 사용하는 이유
일반적으로 동료 수업 간의 관계는 비교적 복잡합니다. 여러 동료 클래스가 상관되면 관계는 복잡한 메쉬 구조로 나타납니다. 이것은 과도하게 결합 된 아키텍처, 즉 클래스 재사용에 도움이되지 않으며 안정적이지 않습니다. 예를 들어, 아래 그림에는 6 개의 동료와 같은 개체가 있습니다. 객체 1이 변경되면 4 개의 객체에 영향을 미칩니다. 객체 2가 변경되면 5 개의 객체에 영향을 미칩니다. 다시 말해, 동료들 사이의 직접적인 상관 관계 설계는 좋지 않습니다.
중개 모델이 도입되면 동료 클래스 간의 관계는 별 구조가됩니다. 그림에서, 우리는 모든 클래스의 변화가 클래스 자체와 중개자에만 영향을 미치므로 시스템의 결합을 줄일 것임을 알 수 있습니다. 좋은 디자인은이 클래스의 모든 객체 관계 처리 로직을 확실히 캡슐화하지는 않지만 특별 클래스를 사용하여 자신이 속하지 않은 동작을 관리합니다.
예
다음은 특정 코드 예입니다. 일반 클래스 다이어그램과 비교하여 AbstractColleague Abstract Compeague 클래스 및 AbstractMediator Abstract 중재자가 추가됩니다. 또한 두 개의 특정 동료 클래스와 하나의 특정 중재자가 있습니다. 코드에는 많은 의견이 있으며 해당 클래스 다이어그램은 제공되지 않으므로 이해하기 어렵지 않습니다.
동료:
// 초록 동료 수업 초록 클래스 AbstractColleague {보호 된 초록 미디어 자 중재자; /** 중개자가 있으므로 각 특정 동료는 중개자와 접촉해야합니다.*그렇지 않으면이 시스템에 존재할 필요가 없습니다. 여기의 생성자는 연락을 취하기 위해 시스템에 중개자를 등록하는 것과 동일합니다*/ public acpractColleague (AbstractMediator Mediator) {this.Mediator = Mediator; } // 추상 동료 클래스에서 중개자 (예 : 등록)에 연락하는 방법을 추가하십시오. Public Void SetMediator (AbstractMediator Mediator) {this.Mediator = Mediator; }} // 특정 동료 A Class Colleaguea는 AbstractCoLeague를 확장합니다. {// 모든 특정 동료가 부모 클래스 생성자 공개 동료 (AbstractMediator Mediator)를 통해 중재자에게 연락합니다. {Super (Mediator); } // 모든 특정 동료가 자신의 작업이 있어야하며 외부 세계 공개 공공 void self () {System.out.println ( "ColleAguea-> 자신의 작업을 수행하십시오 ...")과 연관 될 필요가 없습니다. } // 모든 특정 동료는 항상 외부 세계와 상호 작용하고 이러한 논리를 처리하고 중재자 공개 void out () {System.out.println ( "Colleguea-> 파트 타임 작업을 수행하려면 동료 B 요청 ...")을 통해 작업을 준비해야합니다. super.mediator.execute ( "동료", "self"); }} // 특정 동료 B 클래스 동료는 AbstractColleague를 확장합니다. } public void self () {System.out.println ( "동료 B-> 파트 타임 작업을 수행하십시오 ..."); } public void out () {system.out.println ( "동료 B-> 파트 타임 작업을하도록 동료 A 요청 ..."); super.mediator.execute ( "Colleaguea", "self"); }} 중개 범주 :
// 추상 중개자 초록 클래스 AbstractMediator {// 중개자는 여러 동료의 연락처 정보를 보호해야합니다. // 중개자는 동료 공개 void AddColleague (문자열 이름, AbstractColleague c) {this.colleagues.put (name, c); } // 중개자는 동료 공개 공개 void deletecolleague (문자열 이름) {this.colleagues.remove (name); } // 중개자는 로직을 처리하고 작업 할당하며 동료 간의 의사 소통을 촉진하기위한 작업이 있어야합니다 (문자열 이름, 문자열 메서드); } // 특정 중개자 클래스 중재자 확장 AbstractMediator {// 중개자의 가장 중요한 기능은 동료들 사이에서 앞뒤로 실행하는 것입니다 (문자열 이름, 문자열 메서드) {if ( "self".Equals (method)) {// 각 사람이 자신의 의무를 수행합니다 ( "ColleaGueA". (Colleaguea) Super.colleagues.get ( "Colleaguea"); Colleague.self (); } else {Colleagueb Colleague = (Colleagueb) super.colleagues.get ( "Colleagueb"); Colleague.self (); }} else {// 다른 동료들과 함께 대학 대학 ( "Colleaguea".equals (name)) {Colleaguea 동료 = (Colleaguea) super.colleagues.get ( "Colleaguea"); Colleague.out (); } else {Colleagueb Colleague = (Colleagueb) super.colleagues.get ( "Colleagueb"); Colleague.out (); }}}}} 테스트 클래스 :
// 테스트 클래스 공개 클래스 클라이언트 {public static void main (string [] args) {// 중개자 초록 mediator Mediator = new Mediator ()를 만듭니다. // 동료 두 동료 제작 동료 동료 = 새로운 동료 (중재자); 동료 동료 = 새로운 동료 (중재자); // 중개자는 각 동료 중재자와의 접촉을 설정합니다 .addcolleague ( "Colleaguea", Colleaguea); Mediator.addcolleague ( "동료", 동료); // 동료들은 동료 일을 시작하기 시작합니다. Colleaguea.out (); System.out.println ( "========================================================================================================================= ====================================================================== ======================================================================== ====================================================================== ======================================================================== ======================================================================== ======================================================================== 테스트 결과 :
동료 A-> 귀하의 임무에 참여하십시오 ... 동료 A-> 동료 B에게 귀하의 임무에 귀하의 역할을하도록 ... 동료 B-> 귀하의 임무에 참여하십시오 ... ========================================================= 동료 B-> 귀하의 임무에 참여하십시오 ... 동료 B-> 동료 A에게 귀하의 의무에 귀하의 역할을 수행하도록 요청하십시오 ... 동료 A-> 귀하의 임무에 참여하십시오 ... ========================================================
위의 코드에는 두 개의 특정 동료 클래스만이 있으며 테스트 클래스에서 두 명의 동료 만 만들어 지지만 중개자 모델의 목적에 따라 특정 동료 클래스를 추가 한 다음 중개자가 더 무거운 작업을해야합니다. 왜? 위의 중재자 클래스에는 Execute () 메소드에 많은 긴 판단 코드가 있음을 알 수 있습니다. 중재자 클래스의 다른 개인 방법에 분해되어 추가 될 수 있지만 특정 비즈니스 논리는 필수 불가결합니다.
따라서 동료 간의 연결을 분리하는 동안 중개자 자체는 또한 최고 작업과 일치하지 않습니다. 거의 모든 비즈니스 논리가 중개자에게 설명되기 때문에 "매우 예상되는"역할로 설명 될 수 있기 때문입니다. 이것은 중개 모델의 단점입니다.
또한 위의 코드 예제는 매우 이상적입니다. 때때로 우리는 "동료"사이의 공통점을 전혀 추출하여 추상 COLLEAGUE 초록 동료 클래스를 형성 할 수 없으며, 이는 중개 모델 사용의 어려움을 크게 증가시킵니다.
개정하다:
주어진 개선 방법 2에 따르면 위의 벤지엘 린 (Benjielin)이 제안한 "앱에 노출 된 양방향 협회"의 위 코드 구현에는 단점이 있기 때문에 위의 코드를 다음과 같이 수정하십시오.
수정 된 동료 :
// Abstract Class AbstractColleague {보호 된 AbstractMediator 중재자; // 생성자에서 중재자와의 연결 설정 중지 // public AbstractColleague (AbstractMediator Mediator) {// this.mediator = Mediator; //} // 추상 동료 클래스에 메소드를 추가하여 중재자 (예 : 등록) public void setmediator (AbstractMediator Mediator) {this.Mediator = 중재자; }} // 특정 동료 A Class Colleaguea는 AbstractCoLeague를 확장합니다. {// 생성자에서 중재자와 연결하지 마십시오. //} // 모든 특정 동료는 자신의 부분에 자신의 부분이 있어야하며 외부 세계 대중 공허 self () {System.out.println ( "Colleguea-> 그의 역할을 수행 ...")과 관련 될 필요가 없습니다. } // 모든 특정 동료는 항상 외부 세계와 상호 작용하고 이러한 논리를 처리하고 중재자 공개 void out () {System.out.println ( "ColleAguea-> 그의 일부의 일부를 수행하려면 동료 B 요청 ...")을 통해 작업을 준비해야합니다. super.mediator.execute ( "동료", "self"); }} // 특정 동료 B Class Colleagueb 확장 AbstractCoLeague {// 생성자에서 중재자와의 연결 설정 중지 // public Colleague (AbstractMediator Mediator) {// Super (Mediator); //} public void self () {system.out.println ( "Colleagueb-> 귀하의 부품 ..."); } public void out () {system.out.println ( "Colleagueb-> 동료 A에게 귀하의 역할을하도록 요청합니다 ..."); super.mediator.execute ( "Colleaguea", "self"); }}
수정 된 중개자 :
// 추상 중개자 초록 클래스 AbstractMediator {// 중개자는 여러 동료의 연락처 정보를 보호해야합니다. // 중개자는 동료 공개 void AddColleague (문자열 이름, AbstractColleague c)와 동적으로 접촉 할 수 있습니다. {// 특정 동료가 중개자 C.setmediator (this)에서 연락처를 설정하도록 도와줍니다. this.corpues.put (이름, c); } // 중개자는 동료 대중 공인 deletecolleague (문자열 이름)와 동적으로 접촉 할 수 있습니다. {this.colleagues.remove (name); } // 중개자는 로직을 처리하고 작업 할당하며 동료 간의 의사 소통을 촉진하기위한 작업이 있어야합니다 (문자열 이름, 문자열 메서드); } // 테스트 클래스 공개 클래스 클라이언트 {public static void main (String [] args) {// 중개자 초록 mediator Mediator = new Mediator ()를 만듭니다. // 생성자는 특정 동료가 연락을 취할 수 있도록 중개자를 등록하는 데 사용됩니다. // 동료 동료 = 새로운 동료 (중재자); Colleaguea Colleaguea = New Colleaguea (); 동료 동료 = 새로운 동료 (); // 중개자는 각 동료 중재자와의 접촉을 설정합니다 .addcolleague ( "Colleaguea", Colleaguea); Mediator.addcolleague ( "동료", 동료); // 동료들은 동료 일을 시작하기 시작합니다. Colleaguea.out (); System.out.println ( "=============================================== =========================================================================== =========================================================================== ============================================================================ =========================================================================== =========================================================================== =========================================================================== ============================================================================테스트 후 결과는 수정 전과 동일합니다.