C\#디자인 모델 시리즈 튜 토리 얼-조합 모델
대상 을 트 리 구조 로 조합 하여'부분-전체'의 차원 구 조 를 나타 낸다.조합 모드 는 사용자 로 하여 금 하나의 대상 과 조합 대상 에 대한 사용 이 일치 성 을 가지 게 한다.
2.해결 하 는 문제
하나의 대상 과 조합 대상 의 차 이 를 무시 하고 조합 구조 중의 모든 대상 을 통일 적 으로 사용 하 기 를 원한 다(이러한'통일'성 을 패키지 합 니 다).
3.조합 모드 의 캐릭터
3.1 조합 위 젯(Component):추상 적 인 역할 로 조합 할 대상 에 게 통 일 된 인 터 페 이 스 를 제공 합 니 다.
3.2 잎(Leaf):조합 에서 서브 노드 의 대상 을 나타 내 고 잎 노드 에 서브 노드 가 있 으 면 안 된다.
3.3 합성 위 젯(Composite):지엽 적 인 행동 을 정의 하여 위 젯 을 저장 하고 Component 인터페이스 에서 의 관련 작업 을 실현 합 니 다.예 를 들 어 추가(Add)와 삭제(Remove).
4.패턴 판독
4.1 조합 모델 의 유형 도
4.2 조합 모델 의 실현 코드
/// <summary>
/// , Component
/// </summary>
public abstract class Component
{
protected string name;
public Component(string name)
{
this.name = name;
}
/// <summary>
///
/// </summary>
/// <param name="component"></param>
public abstract void Add(Component component);
/// <summary>
///
/// </summary>
/// <param name="component"></param>
public abstract void Remove(Component component);
/// <summary>
///
/// </summary>
public abstract void Display(int level);
}
/// <summary>
///
/// </summary>
public class Leaf : Component
{
public Leaf(string name)
: base(name)
{ }
/// <summary>
/// , Add Remove , Component, , 。
/// </summary>
/// <param name="component"></param>
public override void Add(Component component)
{
Console.WriteLine("Can not add a component to a leaf.");
}
/// <summary>
/// ,
/// </summary>
/// <param name="component"></param>
public override void Remove(Component component)
{
Console.WriteLine("Can not remove a component to a leaf.");
}
public override void Display(int level)
{
Console.WriteLine(new string('-',level) + name);
}
}
/// <summary>
/// , , Component
/// </summary>
public class Composite : Component
{
public Composite(string name)
: base(name)
{ }
/// <summary>
/// ,
/// </summary>
private List<Component> children = new List<Component>();
/// <summary>
///
/// </summary>
/// <param name="component"></param>
public override void Add(Component component)
{
children.Add(component);
}
/// <summary>
///
/// </summary>
/// <param name="component"></param>
public override void Remove(Component component)
{
children.Remove(component);
}
public override void Display(int level)
{
Console.WriteLine(new string('-', level) + name);
//
foreach (Component component in children)
{
component.Display(level+2);
}
}
}
4.3 클 라 이언 트 코드
class Program
{
static void Main(string[] args)
{
// ,
Component root = new Composite("Root");
root.Add(new Leaf("Leaf A in Root"));
root.Add(new Leaf("Leaf B in Root"));
//
Component branchX = new Composite("Branch X in Root");
Component branchY = new Composite("Branch Y in Root");
root.Add(branchX);
root.Add(branchY);
// BranchX
branchX.Add(new Leaf("Leaf A in Branch X"));
// BranchX
Component branchZ = new Composite("Branch Z in Branch X");
branchX.Add(branchZ);
// BranchY
branchY.Add(new Leaf("Leaf in Branch Y"));
// BranchZ
branchZ.Add(new Leaf("Leaf in Branch Z"));
//
root.Display(1);
Console.Read();
}
}
실행 결과5.투명 방식 과 보안 방식
5.1 투명 방식:Component 에서 하위 대상 을 관리 하 는 모든 방법 을 설명 합 니 다.그 중에서 Add,Remove 등 을 포함 합 니 다.이렇게 Component 인 터 페 이 스 를 실현 하 는 모든 하위 클래스 는 Add 와 Remove 방법 을 갖 추고 있다.이렇게 하 는 장점 은 잎 노드 와 가지 점 이 외부 에 차이 가 없고 완전히 일치 하 는 인 터 페 이 스 를 갖 추고 있다 는 것 이다.
5.2 보안 방식:Component 에서 Add 와 Remove 방법 을 설명 하지 않 으 면 하위 클래스 의 Leaf 는 이 를 실현 하지 않 고 Composit 에서 하위 클래스 대상 을 관리 하 는 모든 방법 을 설명 합 니 다.
5.3 두 가지 방식 은 단점 이 있다.투명 한 방식 에 대해 클 라 이언 트 가 잎 노드 와 가지 점 이 일치 하지만 잎 노드 는 Add 와 Remove 기능 을 가지 지 않 기 때문에 그들의 실현 에 의미 가 없다.안전 방식 에 있어 잎 노드 는 Add 와 Remove 와 같은 방법 을 실현 할 필요 가 없 지만 클 라 이언 트 에 게 잎 노드 와 가지 점 을 판정 하여 클 라 이언 트 의 사용 에 불편 을 가 져 다 주어 야 한다.
6.모델 총화
6.1 장점
6.1.1 클 라 이언 트 호출 을 간단하게 하고 조합 구조 나 그 중의 단일 대상 을 일치 하 게 사용 하여 클 라 이언 트 코드 를 간소화 할 수 있다.
6.1.2 조합 체 내 에 대상 부품 을 추가 하기 쉽다.클 라 이언 트 는 새로운 위 젯 에 가입 했다 고 해서 코드 를 변경 할 필요 가 없습니다.기능 확장 에 유리 하 다.
6.2 단점
6.2.1 투명 한 방식 을 사용 할 지 안전 한 방식 을 선택해 야 한다.
6.2.2 투명 방식 은 대상 을 대상 으로 하 는 단일 직책 원칙 에 위배 된다.안전 방식 은 고객 이 판정 해 야 할 부담 을 증가 시 켰 다.
6.3 적용 필드
6.3.1 대상 의 부분-전체적인 차원 구 조 를 표현 하고 자 할 때
6.3.3 사용자 가 조합 대상 과 하나의 대상 이 다 르 기 를 무시 하고 사용자 가 조합 구조의 모든 대상 을 통일 적 으로 사용 할 때.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.