데코레이터 패턴 정의: 파생 클래스를 통해 클래스 속성 작업을 추가하거나 수정하는 대신 패턴 디자인을 통해 이 효과를 동적으로 구현합니다. 이는 상속보다 더 편리하고 유연하며 프로그램의 복잡성을 줄여줍니다.
예
Wang Feng은 챔피언십 팀을 구성합니다.
우선 팀 카테고리가 비어 있습니다. Wang Feng의 지속적인 노력 끝에 그는 팀의 학생을 확보하고 팀원이 수행할 수 있는 적합한 플랫폼을 만들었습니다.
다양한 요구에 따라 기본 클래스를 추가하고 수정하여 최종적으로 사용자의 승인을 얻고 요구 사항을 충족시키는 것은 데코레이터입니다.
어셈블러 패턴을 구현한 클래스 다이어그램:
팀 구성 코드
//汪峰战队 abstract class WangFengTeam { //执行策划命令 abstract public void Acrion(); } //学员 class Student : WangFengTeam { // Methods override public void Acrion() { Console.WriteLine("汪峰团队学员情况:"); } } // 战队总策划 abstract class Direct : WangFengTeam { //汪峰战队 protected WangFengTeam team; // 策划活动 public void SetComponent(WangFengTeam team) { this.team = team; } //执行策划 override public void Acrion() { if (team != null) { team.Acrion(); } } } //男孩唱狂放型的,构建一个组合。 class BoyTeam : Direct { // 组合名称 public string teamName= "锋利的Jquery"; //具体策划 override public void Acrion() { base.Acrion(); Console.WriteLine("我是汪峰团队,狂放型的。"); } } //女孩唱婉约型的,来个模特表演 class GrilTeam : Direct { //具体策划 override public void Acrion() { base.Acrion(); Console.WriteLine("我是汪峰团队,婉约型的。"); //模特表演 show(); } public void show() { Console.WriteLine("婉约型,走秀"); } }
클라이언트 코드:
public static void Main() { Student team = new Student(); BoyTeam boy = new BoyTeam(); GrilTeam girl = new GrilTeam(); //团队男孩装饰 boy.SetComponent(team); //团队女孩装饰 girl.SetComponent(boy); girl.Acrion(); Console.Read(); }
장점 및 데코레이터 패턴의 단점
데코레이터 패턴에 대한 자세한 소개를 읽은 후 계속해서 장점과 단점을 분석해 보겠습니다.
장점:
데코레이터 패턴과 상속의 목적은 객체의 기능을 확장하는 것이지만 데코레이터 패턴은 상속보다 더 유연합니다.
다양한 구체적인 데코레이션 클래스와 이러한 클래스의 순열 및 조합을 사용하여 디자이너는 다양한 동작의 다양한 조합을 만들 수 있습니다.
데코레이터 패턴은 확장성이 좋습니다
단점:
장식 연산자 패턴을 사용하면 디자인에 작은 개체가 많이 생기고 과도하게 사용하면 프로그램이 더 복잡해집니다. 그리고 개체가 많을수록 실수하기가 더 어려워집니다. 특히 모두 비슷해 보이는 경우에는 더욱 그렇습니다.
사용 시나리오
데코레이터 패턴이 사용되는 구체적인 상황을 살펴보겠습니다. 데코레이터 패턴은 다음 상황에서 사용해야 합니다.
클래스의 기능을 확장해야 하거나 수업에 추가 책임을 추가합니다.
객체에 기능을 동적으로 추가해야 하며 이러한 기능은 동적으로 취소될 수 있습니다.
일부 기본 함수의 순열과 조합으로 생성되는 매우 많은 수의 함수를 추가해야 함
.NET에서 데코레이터 패턴 구현
.NET 클래스 라이브러리 구현, 이 클래스는 System.IO.Stream입니다. Stream 클래스 구조를 살펴보겠습니다.
BufferedStream, CryptoStream 및 GZipStream은 실제로 두 가지 특정 장식입니다. 여기서 데코레이터는 추상 데코레이터 역할(Decorator)을 생략한 패턴입니다. 다음은 클라이언트가 MemoryStream에 기능을 동적으로 추가하는 방법을 보여줍니다.
MemoryStream memoryStream = new MemoryStream(new byte[] {95,96,97,98,99}); // 扩展缓冲的功能 BufferedStream buffStream = new BufferedStream(memoryStream); // 添加加密的功能 CryptoStream cryptoStream = new CryptoStream(memoryStream,new AesManaged().CreateEncryptor(),CryptoStreamMode.Write); // 添加压缩功能 GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, true);
요약
데코레이터 패턴 소개는 여기까지입니다. 데코레이터 패턴은 상속 대신 객체 구성을 사용하여 런타임 시 객체 기능을 동적으로 확장할 수 있습니다. 필요에 따라 여러 기능을 확장하여 상속만 사용하여 발생하는 "낮은 유연성" 및 "다중 하위 클래스 파생 문제"를 방지합니다. 동시에 "상속보다 객체 구성을 선호한다"는 객체지향 설계 원칙과 "개방-폐쇄" 원칙에 잘 부합합니다.
C# 디자인 패턴 프로그래밍에서 데코레이터 패턴을 분석하는 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!