중재자 패턴
객체 지향 설계는 다양한 객체 간의 동작 분포를 장려합니다. 이 분포는 최악의 경우 각 객체 간에 많은 연결을 초래할 수 있습니다.
시스템을 여러 객체로 나누면 재사용성이 높아지지만, 객체 간의 상호 연결이 늘어나면 재사용성이 많이 떨어집니다. 다른 개체의 지원(시스템은 분할할 수 없는 전체로 나타남) 현재 시스템 동작을 크게 변경하는 것은 매우 어렵습니다. 동작이 여러 개체에 분산되어 있기 때문에 결과적으로 많은 하위 클래스가 필요하게 됩니다. 따라서 우리는 중재자 객체 Mediator를 도입했습니다:
중개자 객체를 통해 네트워크 구조는 다음과 같습니다. 시스템은 스타로 변형됩니다. 매개자를 중심으로 하는 구조. 각각의 특정 객체는 더 이상 다른 객체와 직접적인 관계를 갖지 않고 매개 객체를 통해 매개됩니다. 또한 매개 객체의 도입으로 인해 시스템 구조가 영향을 받지 않게 됩니다. 새로운 객체로 인해 많은 수정이 발생했습니다.
매개자 패턴: 중재자 패턴이라고도 알려진 중재자 객체(Mediator)는 일련의 객체의 상호 작용을 캡슐화하여 각 객체가 통신할 수 있도록 하는 데 사용됩니다. 참조를 표시하지 않고도 서로 참조하여 결합을 느슨하게 하고 상호 작용을 독립적으로 변경할 수 있습니다.
(이미지 출처: Design Patterns: The Foundation of 재사용 가능한 객체 지향 소프트웨어) 팁: 각 동료는 중재자의 존재만 알고 있으며, 다른 동료가 존재하는지 여부(그렇지 않은 경우 이를 분리하는 방법)는 알 필요가 없습니다. 중재자는 이를 다른 동료에게 전달합니다(중재자는 모든 동료 관계를 저장하며 중재자만이 동료 수/동료가 몇 명인지 알고 있습니다).
모드 구현
UN은 다양한 국가의 성명을 전달합니다. 그리고 국가 간 관계를 중재합니다:
국가는 유엔 안전보장이사회에 메시지를 보내고 받습니다. 유엔 안전보장이사회는 국가 간의 협력적 행동을 적절하게 이행하기 위한 전달 요청을 중재합니다:
동료
추상 동료 클래스, 각 동료의 공개 메소드 정의:
/** * @author jifang * @since 16/8/28 下午4:22. */ public abstract class Country { protected UnitedNations mediator; private String name; public Country(UnitedNations mediator, String name) { this.mediator = mediator; this.name = name; } public String getName() { return name; } protected abstract void declare(String msg); protected abstract void receive(String msg); }
------------ ------------ ------------ ---------
ConcreteColleague
구체적인 동료 클래스:
•각 동료 클래스는 중재자 개체를 알고 있습니다.
•각 동료 개체는 다음과 같은 경우 중재자와 통신합니다. 다른 동료들과 소통해야 해요.
------ --------------- --------- ----------
Mediator
추상 중재자: 각 동료 객체와 통신하기 위한 인터페이스 정의:
class USA extends Country { public USA(UnitedNations mediator, String name) { super(mediator, name); } @Override public void declare(String msg) { mediator.declare(this, msg); } @Override public void receive(String msg) { System.out.println("美国接收到: [" + msg + "]"); } } class Iraq extends Country { public Iraq(UnitedNations mediator, String name) { super(mediator, name); } @Override public void declare(String msg) { mediator.declare(this, msg); } @Override public void receive(String msg) { System.out.println("伊拉克接收到: [" + msg + "]"); } } class China extends Country { public China(UnitedNations mediator, String name) { super(mediator, name); } @Override public void declare(String msg) { mediator.declare(this, msg); } @Override public void receive(String msg) { System.out.println("中国接收到: [" + msg + "]"); } }
---------------------- -------------------------- ----------- -------------
ConcreteMediator
특정 중개자:
•다양한 동료를 이해하고 유지합니다.
•각각의 조정을 통해 협력적 행동을 달성합니다. 동료 객체(동료로부터 메시지 수신, 특정 동료에게 명령 실행)
public abstract class UnitedNations { protected List<Country> countries = new LinkedList<>(); public void register(Country country) { countries.add(country); } public void remove(Country country) { countries.remove(country); } protected abstract void declare(Country country, String msg); }
확장이 없으면 Mediator를 ConcreteMediator와 결합할 수 있습니다.
•클라이언트
class UnitedNationsSecurityCouncil extends UnitedNations { /** * 安理会在中间作出调停 * * @param country * @param msg */ @Override protected void declare(Country country, String msg) { for (Country toCountry : countries) { if (!toCountry.equals(country)) { String name = country.getName(); toCountry.receive(name + "平和的说: " + msg); } } } }
- --------- --------------- --------- -------
요약
Mediator의 출현으로 두 요소 간의 결합이 감소합니다. 동료, 객체가 협력하는 방식에 따라 각 동료와 중재자를 독립적으로 변경하고 재사용할 수 있음 추상화를 제거하고 중개자를 독립적인 개념으로 취급하고 객체에 캡슐화함으로써 관심의 초점이 객체 자체의 동작에서 객체로 이동합니다. 보다 거시적인 관점에서 볼 수 있도록 합니다.
•적용성
중개자 패턴은 시스템에 적용하기 쉽고 오용도 쉽습니다. 시스템에 "다대다" 상호작용이 있는 복잡한 개체 그룹이 있는 경우 중재자를 사용할 때는 서두르지 말고 시스템 설계가 합리적인지 먼저 생각해 보는 것이 가장 좋습니다. . ConcreteMediator는 중앙 집중화를 제어하므로 중재자를 중재자의 복잡성으로 전환하여 중재자를 다른 중재자보다 더 복잡하게 만듭니다. ConcreteColleagues는 다음과 같은 상황에서 권장됩니다. 명확하게 정의되어 있지만 복잡한 방식으로 통신합니다. 결과적인 상호의존성은 복잡하고 이해하기 어렵습니다.
◦ 하나의 객체가 다른 객체를 참조하며 이러한 객체와 직접 통신하므로 객체를 재사용하기가 어렵습니다.
◦ 여러 클래스에 분산되는 동작을 사용자 정의하고 싶지만 너무 많은 하위 클래스를 생성하고 싶지 않습니다.
•관련 패턴
◦ Facade와 mediator의 차이점은 객체 하위 시스템을 추상화하여 보다 편리한 인터페이스를 제공한다는 것입니다. 프로토콜은 단방향, 즉 Facade 객체입니다. 이 하위 시스템 클래스에 요청합니다. 그러나 그 반대는 아닙니다. Mediator는 각 Colleague 객체가 지원하지 않거나 지원할 수 없는 협업 동작을 제공하며 프로토콜은 다방향입니다.
◦ Colleague는 Mediator와 통신할 수 있습니다. 🎜>