>  기사  >  Java  >  중재자 패턴에 대한 자바 디자인 패턴에 대한 자세한 설명(그림)

중재자 패턴에 대한 자바 디자인 패턴에 대한 자세한 설명(그림)

黄舟
黄舟원래의
2017-08-11 10:03:191100검색

이 글은 주로 디자인 패턴 중 중간 패턴 관련 정보를 자세히 소개합니다. 관심 있는 친구들이 참고할 수 있습니다.

정의: 중간 객체를 사용하여 일련의 객체 상호 작용을 캡슐화합니다. 중재자는 개체가 명시적인 상호 작용 없이 상호 작용할 수 있도록 하므로 결합이 느슨해지고 개체 간의 상호 작용이 독립적으로 변경될 수 있습니다.

유형: 행동 패턴

클래스 다이어그램:

20162593206564.jpg (526×202)

중간 패턴의 구조

중간 패턴은 클래스 다이어그램에서 3가지로 나누어집니다. Part:

Abstract mediator: 다양한 동료 클래스 간의 통신에 사용되는 동료 클래스 객체에서 중재자 객체까지의 인터페이스를 정의합니다. 일반적으로 하나 이상의 추상 이벤트 메서드를 포함하며 하위 클래스에 의해 구현됩니다.

Mediator 구현 클래스: 추상 중재자에서 상속되며 추상 중재자에 정의된 이벤트 메서드를 구현합니다. 피어 클래스로부터 메시지를 받은 후 해당 메시지를 통해 다른 동시 클래스에 영향을 줍니다.

동료 클래스: 객체가 다른 객체에 영향을 미치고 다른 객체의 영향도 받는 경우 이 두 객체를 동료 클래스라고 합니다. 클래스 다이어그램에는 동료 클래스가 하나만 있는데 이는 실제로 현실이 생략된 것입니다. 실제 응용에서 동료 클래스는 일반적으로 여러 클래스로 구성되며 서로 상호 작용하고 의존합니다. 동료 유형이 많을수록 관계는 더욱 복잡해집니다. 또한 동료 클래스는 동일한 추상 클래스를 상속하는 구현 그룹으로 표시될 수도 있습니다. 중재자 패턴에서는 중재자를 통해 동료 클래스 간에 메시지가 전달되어야 합니다.

중개 패턴을 ​​사용하는 이유

일반적으로 동료 클래스 간의 관계는 상대적으로 복잡합니다. 여러 동료 클래스가 서로 관련되면 이들 간의 관계가 복잡한 네트워크 구조로 나타납니다. 지나치게 결합된 아키텍처는 클래스 재사용에 도움이 되지 않으며 불안정합니다. 예를 들어 아래 그림에는 6개의 동료 클래스 개체가 있습니다. 개체 1이 변경되면 4개의 개체가 영향을 받습니다. 개체 2가 변경되면 개체 5개가 영향을 받습니다. 즉, 동료 계층 간의 직접적인 상관 관계 설계가 좋지 않습니다.

20162593302973.jpg (431×252)20162593327585.jpg (419×251)

중개자 패턴을 도입하면 그림에서 볼 수 있듯이 동료 클래스 간의 관계가 스타 구조가 됩니다. 어떤 클래스를 변경하더라도 클래스 자체와 중개자에만 영향을 미치게 됩니다. 시스템의 결합. 좋은 디자인은 이 클래스의 모든 개체 관계 처리 논리를 캡슐화하지 않지만 특수 클래스를 사용하여 자신에게 속하지 않은 동작을 관리합니다.

20162593346671.jpg (427×357)

동료 반이 무엇인지 예를 들어 보겠습니다. 두 반 A와 B가 있습니다. 각 반에는 숫자가 있으며, 반 B의 숫자는 항상 A반의 숫자보다 100배가 되도록 해야 합니다. 클래스 A. 즉, 클래스 A의 숫자를 수정하는 경우에는 그 숫자에 100을 곱하여 클래스 B에 할당하고, 클래스 B를 수정하는 경우에는 그 숫자를 100으로 나누어 클래스 A에 할당합니다. 클래스 A와 클래스 B는 서로 상호 작용하며 공동 클래스라고 합니다. 코드는 다음과 같습니다.


abstract class AbstractColleague { 
  protected int number; 
 
  public int getNumber() { 
    return number; 
  } 
 
  public void setNumber(int number){ 
    this.number = number; 
  } 
  //抽象方法,修改数字时同时修改关联对象 
  public abstract void setNumber(int number, AbstractColleague coll); 
} 
 
class ColleagueA extends AbstractColleague{ 
  public void setNumber(int number, AbstractColleague coll) { 
    this.number = number; 
    coll.setNumber(number*100); 
  } 
} 
 
class ColleagueB extends AbstractColleague{ 
   
  public void setNumber(int number, AbstractColleague coll) { 
    this.number = number; 
    coll.setNumber(number/100); 
  } 
} 
 
public class Client { 
  public static void main(String[] args){ 
 
    AbstractColleague collA = new ColleagueA(); 
    AbstractColleague collB = new ColleagueB(); 
     
   System.out.println("==========设置A影响B=========="); 
    collA.setNumber(1288, collB); 
    System.out.println("collA的number值:"+collA.getNumber()); 
    System.out.println("collB的number值:"+collB.getNumber()); 
 
    System.out.println("==========设置B影响A=========="); 
    collB.setNumber(87635, collA); 
    System.out.println("collB的number值:"+collB.getNumber()); 
    System.out.println("collA的number值:"+collA.getNumber()); 
  } 
}

위 코드에서 클래스 A와 클래스 B는 중간 모드를 사용하려면 클래스 A와 클래스 B가 직접 연관될 수 없습니다. 협회의 목적은 중개자를 통해 달성됩니다.


abstract class AbstractColleague { 
  protected int number; 
 
  public int getNumber() { 
    return number; 
  } 
 
  public void setNumber(int number){ 
    this.number = number; 
  } 
  //注意这里的参数不再是同事类,而是一个中介者 
  public abstract void setNumber(int number, AbstractMediator am); 
} 
 
class ColleagueA extends AbstractColleague{ 
 
  public void setNumber(int number, AbstractMediator am) { 
    this.number = number; 
    am.AaffectB(); 
  } 
} 
 
class ColleagueB extends AbstractColleague{ 
 
  @Override 
  public void setNumber(int number, AbstractMediator am) { 
    this.number = number; 
    am.BaffectA(); 
  } 
} 
 
abstract class AbstractMediator { 
  protected AbstractColleague A; 
  protected AbstractColleague B; 
   
  public AbstractMediator(AbstractColleague a, AbstractColleague b) { 
    A = a; 
    B = b; 
  } 
 
  public abstract void AaffectB(); 
   
  public abstract void BaffectA(); 
 
} 
class Mediator extends AbstractMediator { 
 
  public Mediator(AbstractColleague a, AbstractColleague b) { 
    super(a, b); 
  } 
 
  //处理A对B的影响 
  public void AaffectB() { 
    int number = A.getNumber(); 。
    B.setNumber(number*100); 
  } 
 
  //处理B对A的影响 
  public void BaffectA() { 
    int number = B.getNumber(); 
    A.setNumber(number/100); 
  } 
} 
 
public class Client { 
  public static void main(String[] args){ 
    AbstractColleague collA = new ColleagueA(); 
    AbstractColleague collB = new ColleagueB(); 
     
    AbstractMediator am = new Mediator(collA, collB); 
     
    System.out.println("==========通过设置A影响B=========="); 
    collA.setNumber(1000, am); 
    System.out.println("collA的number值为:"+collA.getNumber()); 
    System.out.println("collB的number值为A的10倍:"+collB.getNumber()); 
 
    System.out.println("==========通过设置B影响A=========="); 
    collB.setNumber(1000, am); 
    System.out.println("collB的number值为:"+collB.getNumber()); 
    System.out.println("collA的number值为B的0.1倍:"+collA.getNumber()); 
     
  } 
}

코드가 비교적 길지만 그래도 비교적 이해하기 쉽습니다. 사실 객체 관계를 처리하는 원래 코드를 중간 클래스로 다시 캡슐화하고, 이 중간 클래스를 사용하여 처리하는 것입니다. 객체 간의 관계.

조정자 패턴의 장점

 조정자 패턴을 올바르게 사용하면 동료 클래스 간의 과도한 결합을 방지하여 각 동료 클래스를 상대적으로 독립적으로 사용할 수 있습니다.
 중개자 패턴을 사용하면 객체 간의 일대다 연관을 일대일 연관으로 변환하여 객체 간의 관계를 쉽게 이해하고 유지 관리할 수 있습니다.
 중재자 패턴을 사용하면 객체의 동작과 협업을 추상화할 수 있으며 객체 간의 상호 작용을 보다 유연하게 처리할 수 있습니다.

적용 가능한 시나리오

객체 지향 프로그래밍에서 클래스는 필연적으로 다른 클래스에 종속되며 완전히 독립적인 클래스는 의미가 없습니다. 클래스가 동시에 여러 클래스에 의존하는 경우도 매우 흔합니다. 이러한 상황이 존재하므로 중재자 패턴을 적절하게 사용하면 원래의 관계가 복잡해질 수 있습니다. 대상관계는 명확하지만, 학대할 경우 반대 효과가 나타날 수 있습니다. 일반적으로 중재자 패턴은 동료 클래스 간의 네트워크 구조와의 관계에 대해서만 고려됩니다. 네트워크 구조를 스타 구조로 변경하여 클래스 간의 관계를 보다 명확하게 만들 수 있습니다.

중개 모델은 흔히 사용되는 모델이기도 하고, 악용되기 쉬운 모델이기도 합니다. 대부분의 경우 동료 클래스 간의 관계는 혼란스러운 네트워크 구조만큼 복잡하지 않습니다. 따라서 대부분의 경우 동료 클래스 내부에 개체 간의 종속성을 캡슐화하는 것으로 충분합니다. 방법. 중개 모델을 남용하면 상황이 더욱 복잡해집니다.

위 내용은 중재자 패턴에 대한 자바 디자인 패턴에 대한 자세한 설명(그림)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.