집 >백엔드 개발 >C#.Net 튜토리얼 >.NET 장식 모드 설명
데코레이션 모드 정의:
데코레이션 모드는 원본 클래스 파일을 변경하지 않고 상속을 사용하지 않고 객체를 동적으로 확장하는 기능입니다. 감싸는 오브제, 즉 장식물을 생성하여 실물을 감싸는 것입니다.
데코레이터 패턴 구조도:
데코레이터 패턴 역할:
(1) 추상 컴포넌트(Component) 역할: 주어 추상 인터페이스 추가 책임을 받을 준비가 된 개체를 지정합니다.
(2) 구체적인 구성 요소 역할: 추가 책임을 맡을 클래스를 정의합니다.
(3) 데코레이터 역할: 컴포넌트 객체의 인스턴스를 보유하고 추상 컴포넌트 인터페이스와 일치하는 인터페이스를 구현합니다.
(4) 콘크리트 데코레이터 역할: 구성 요소 개체에 추가 책임을 추가하는 역할을 담당합니다.
구현:
실생활의 예를 인용하면서 새 휴대폰을 구입하고 휴대폰에 필름, 펜던트 등 새로운 장식을 천천히 추가했습니다.... .
1. 먼저 휴대폰 클래스를 데코레이터 패턴의 추상 구성 요소로 추상화합니다.
/// <summary> /// 手机抽象类,即抽象者模式中的抽象组件类 /// </summary> public abstract class Phone { /// <summary> /// 打印方法 /// </summary> public abstract void Print(); }
2. 이제 Apple 휴대폰을 구입했다면, 이제 추상 클래스를 상속하고 특정 구성 요소 클래스를 구현합니다.
/// <summary> /// 苹果手机,即装饰着模式中的具体组件类 /// </summary> public class ApplePhone:Phone { /// <summary> /// 重写基类的方法 /// </summary> public override void Print() { Console.WriteLine("我有一部苹果手机"); } }
3. 이제 장식을 위해 이 전화기에 새 구성 요소를 추가하고 싶습니다. , 먼저 장식 클래스를 추상화합니다.
/// <summary> /// 装饰抽象类,让装饰完全取代抽象组件,所以必须继承Phone /// </summary> public abstract class Decorator:Phone { private Phone p ; //该装饰对象装饰到的Phone组件实体对象 public Decorator(Phone p) { this.p = p; } public override void Print() { if (this.p != null) { p.Print(); } } }
4. 특정 장식 객체는 장식 추상 클래스를 상속합니다. 다음은 특정 영화 장식과 펜던트 장식입니다. :
/// <summary> /// 贴膜,具体装饰者 /// </summary> public class Sticker:Decorator { public Sticker(Phone p) : base(p) { } public override void Print() { base.Print(); //添加行为 AddSticker(); } /// <summary> /// 新的行为方法 /// </summary> public void AddSticker() { Console.WriteLine("现在苹果手机有贴膜了"); } }
/// <summary> /// 手机挂件,即具体装饰者 /// </summary> public class Accessories:Decorator { public Accessories(Phone p) : base(p) { } public override void Print() { base.Print(); // 添加新的行为 AddAccessories(); } /// <summary> /// 新的行为方法 /// </summary> public void AddAccessories() { Console.WriteLine("现在苹果手机有漂亮的挂件了"); } }
5. 호출:
/// <summary> /// 设计模式-装饰者模式 /// </summary> class Program { static void Main(string[] args) { Phone ap = new ApplePhone(); //新买了个苹果手机 Decorator aps = new Sticker(ap); //准备贴膜组件 aps.Print(); Decorator apa = new Accessories(ap); //过了几天新增了挂件组件 apa.Print(); Sticker s = new Sticker(ap); //准备贴膜组件 Accessories a = new Accessories(s);//同时准备挂件 a.Print(); } }
(1) 추상 구성 요소 역할: 추상 인터페이스 제공 추가 책임을 받을 준비가 된 개체를 지정합니다. >전화 인터페이스는 다음과 같습니다
(2) 구체적인 구성 요소 역할: 추가 책임을 맡을 클래스를 정의합니다. ~ ApplePhone
(3) 데코레이터 역할: 컴포넌트(Component) 객체의 인스턴스를 보유하고 추상 컴포넌트 인터페이스와 일치하는 인터페이스를 구현합니다. >데코레이터를 말합니다
(4) 콘크리트 데코레이터 역할: 컴포넌트 객체에 추가적인 책임을 추가하는 역할을 담당합니다. >액세서리 및 스티커 참조
장점:
1. Decorator 패턴과 상속 관계의 목적은 객체의 기능을 확장하는 것이지만 Decorator는 상속보다 더 많은 유연성을 제공할 수 있습니다.
2. 다양한 특정 데코레이션 클래스와 이러한 데코레이션 클래스의 배열 및 조합을 사용하여 디자이너는 다양한 동작의 다양한 조합을 만들 수 있습니다.
단점:
1. 이 기능은 상속보다 유연하지만 복잡성도 더 높습니다.
2. 장식 모드를 과도하게 사용하면 프로그램이 매우 복잡해집니다.
3. 데코레이션 모드는 추상 컴포넌트(Component) 형태의 프로그래밍을 위한 모드입니다. 그러나 특정 구성 요소에 대해 프로그래밍하는 경우 애플리케이션 아키텍처와 데코레이터가 적절한지 다시 생각해야 합니다. 물론 구성 요소 인터페이스를 변경하고, 새로운 공용 동작을 추가하고, "반투명" 데코레이터 모드를 구현할 수도 있습니다. 실제 프로젝트에서 최선의 선택을 해보세요.
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다.