C\#디자인 모델 시리즈 튜 토리 얼-장식 모델
동태 적 으로 한 대상 에 게 추가 적 인 직책 을 추가 하면 기능 을 증가 하 는 데 있어 장식 모델 은 하위 클래스 를 생 성 하 는 것 보다 더욱 유연 하 다.
원리:수식 류 를 추가 하여 원래 의 종 류 를 감 싸 는 방식 은 일반적으로 원래 의 대상 을 수식 류 의 구조 함수 로 하 는 매개 변수 이다.장식 류 는 새로운 기능 을 실현 하지만 새로운 기능 을 사용 하지 않 아 도 되 는 곳 에서 원래 의 유형 중의 방법 을 직접 호출 할 수 있다.수식 류 는 반드시 원래 의 종류 와 같은 인터페이스 가 있어 야 한다.
2.모드 속 캐릭터
2.1 추상 적 인 구축(Component):추상 적 인 인 터 페 이 스 를 정의 하여 이 대상 에 게 동적 으로 직책 을 추가 하도록 한다.
2.2 구체 적 인 구축(Concrete Component):구체 적 인 대상 을 정의 하고 이 대상 에 게 직책 을 추가 할 수 있다.
2.3 장식 류(Decorator):장식 추상 류 는 Component 를 계승 하고 외부 에서 Component 류 의 기능 을 확대 한다.
2.4 구체 적 인 장식 자(Concretor Decorator):구축 대상 에 직책 을 추가 하 는 것 을 책임 진다.
3.패턴 판독
3.1 장식 모델 의 일반화 유형 도
3.2 장식 모드 의 일반화 코드
/// <summary>
/// ,
/// </summary>
public abstract class Component
{
public abstract void Opration();
}
/// <summary>
///
/// </summary>
public class ConcreteComponent:Component
{
public override void Opration()
{
//
}
}
/// <summary>
/// , 。
/// </summary>
public abstract class Decorator:Component
{
protected Component component;
/// <summary>
/// Component
/// </summary>
/// <param name="component"></param>
public void SetComponent(Component component)
{
this.component = component;
}
/// <summary>
/// Operation, Component Operation。
/// </summary>
public override void Opration()
{
if (component != null)
{
component.Opration();
}
}
}
public class ConcreteDecoratorA : Decorator
{
private void SpecialOpration()
{
//
}
public override void Opration()
{
// Component Operation(), , Component
base.Opration();
this.SpecialOpration();
}
}
public class ConcreteDecoratorB : Decorator
{
private void SpecialOprationA()
{
// A
}
private void SpecialOprationB()
{
// B
}
public override void Opration()
{
// Component Operation(), , Component
base.Opration();
this.SpecialOprationA();
this.SpecialOprationB();
}
}
4.모델 총화4.1 장점
4.1.1 모든 장식 대상 은 자신의 기능 에 만 관심 을 가지 고 대상 체인 에 어떻게 추가 되 는 지 에 관심 을 가 질 필요 가 없다.그것 은 Decorator 의 SetComponent 방법 으로 이 루어 지기 때문에 그들의 직책 은 단일 하 다.
4.1.2 류 의 핵심 직책 과 동태 적 으로 추 가 된 직책 은 분리 된다.만약 에 주 류 에 새로운 기능 을 추가 하면 하 나 는 개방 폐쇄 원칙 을 위반 하고 다른 하 나 는 주 류 의 복잡 도 를 증가 하 는 것 이다.
4.1.3 정적 계승 보다 유연 하고 대상 의 정적 계승 에 비해 Decorator 모델 은 대상 에 게 더욱 유연 하 게 직책 을 추가 하 는 방식 을 제공 하고 추가 와 분리 하 는 방법 을 사용 하여 운영 시간 에 장식 으로 직책 을 증가 하고 삭제 할 수 있다.
4.2 단점
4.2.1 많은 작은 대상 이 생기 고 Decorator 모델 로 시스템 디자인 을 하면 비슷 해 보 이 는 작은 대상 이 많이 생 긴 다.이런 대상 들 은 서로 연결 하 는 방식 만 다르다.
4.3 적용 필드
4.3.1 기 존 기능 에 더 많은 기능 을 동적 으로 추가 해 야 할 때.
4.3.2 류 의 핵심 기능 은 바 꿀 필요 가 없고 새로운 기능 을 추가 해 야 할 때 만 사용 할 수 있다.
5.응용 실례:장비 대군!어떠한 장비 도 없 을 때(핵심 기능)주먹 과 발 로 격투 할 수 있다.소총 을 장 착 하여 정상적으로 사격 할 수 있다.중기 총 을 장 착 하여 소사 할 수 있다.로켓 통 을 장 착 하여 방공 할 수 있다.
5.1 유형 도 디자인
5.2 코드 구현
/// <summary>
/// , Component
/// </summary>
public abstract class Equipment
{
public abstract void Attack();
}
/// <summary>
/// , Equipment
/// </summary>
public class Soldier : Equipment
{
public Soldier()
{
//
}
/// <summary>
///
/// </summary>
public override void Attack()
{
Console.WriteLine(" !");
}
}
public abstract class EquipDecorator : Equipment
{
protected Equipment equipment;
/// <summary>
/// ,
/// </summary>
/// <param name="equipment"></param>
public void SetComponent(Equipment equipment)
{
this.equipment = equipment;
}
/// <summary>
///
/// </summary>
public override void Attack()
{
// ,
if (equipment != null)
{
equipment.Attack();
}
}
}
/// <summary>
///
/// </summary>
public class RifleEquipment : EquipDecorator
{
public override void Attack()
{
base.Attack();
Console.WriteLine(" , !");
}
}
/// <summary>
///
/// </summary>
public class MachineGunEquipment : EquipDecorator
{
public override void Attack()
{
base.Attack();
Console.WriteLine(" , !");
}
}
/// <summary>
///
/// </summary>
public class RocketGunEquipment : EquipDecorator
{
public override void Attack()
{
base.Attack();
Console.WriteLine(" , ......!");
}
}
5.3 클 라 이언 트 호출
class Program
{
static void Main(string[] args)
{
//
Soldier soldier = new Soldier();
//
RifleEquipment rifle = new RifleEquipment();
MachineGunEquipment machineGun = new MachineGunEquipment();
RocketGunEquipment rocketGun = new RocketGunEquipment();
//
rifle.SetComponent(soldier);
machineGun.SetComponent(rifle);
rocketGun.SetComponent(machineGun);
// , , , , . rocketGun.Attack().
rocketGun.Attack();
Console.Read();
}
}
5.4 실행 결과주먹 과 발 로 공격!
소총 사격!탁!
기관총 소사,돌격!
로켓 사격!쏴!!
이상 이 바로 본문의 전체 내용 입 니 다.여러분 께 참고 가 될 수 있 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.