(34) C \ # 디자인 모델 - 장식 자 모델 (장식 자 패턴)

머리말
소프트웨어 개발 에서 우 리 는 핸드폰 에 스티커, 액세서리, 케이스 등 다양한 기능 을 추가 하려 고 한다.이때 계승 을 통 해 이 루어 진다 면 우 리 는 수많은 종 류 를 정의 해 야 한다. 그러면 '하위 폭발' 의 문 제 를 초래 할 수 있다.이 문 제 를 해결 하기 위해 장식 자 모드 를 사용 하여 대상 에 게 동적 으로 추가 적 인 직책 을 추가 할 수 있다.
장식 자 모드 에 대한 상세 한 소개
정의.
장식 자 모델 은 고객 에 게 투명 한 방식 으로 동태 적 으로 한 대상 에 게 더 많은 직책 을 부가 하고 장식 자 모델 은 서브 클래스 를 생 성 하 는 것 보다 더욱 유연 하 게 기능 을 증가 할 수 있다.
구체 적 실현
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _23DecoratorPatternDemo
{
    /// 
    ///      ,             
    /// 
    public abstract class Phone
    {
        public abstract void Print();
    }
    /// 
    ///   ,             
    /// 
    public class ApplePhone : Phone
    {
        public override void Print()
        {
            Console.WriteLine("         ————    ");
        }
    }
    /// 
    ///      ,            ,     Phone
    /// 
    public abstract class Decorator :Phone
    {
        private Phone phone;
        public Decorator(Phone p)
        {
            this.phone = p;
        }
        public override void Print()
        {
            if(phone!=null)
            {
                phone.Print();
            }
        }
    }
    /// 
    ///   ,      
    /// 
    public class Sticker:Decorator
    {
        public Sticker(Phone p):base(p)
        {

        }
        public override void Print()
        {
            base.Print();
            //     
            AddSticker();
        }
        /// 
        ///       
        /// 
        public void AddSticker()
        {
            Console.WriteLine("         ");
        }
    }
    /// 
    ///     
    /// 
    public class Accessories : Decorator
    {
        public Accessories(Phone p) : base(p)
        {
        }
        public override void Print()
        {
            base.Print();
            AddAccessories();
        }
        public void AddAccessories()
        {
            Console.WriteLine("          ");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //         
            Phone phone = new ApplePhone();

            //       
            Decorator applePhoneWithSticker = new Sticker(phone);
            //       
            applePhoneWithSticker.Print();
            Console.WriteLine("----------------------
"); // Decorator applePhoneWithAccessories = new Accessories(phone); // applePhoneWithAccessories.Print(); Console.WriteLine("----------------------
"); // Sticker sticker = new Sticker(phone); Accessories applePhoneWithAccessoriesAndSticker = new Accessories(sticker); applePhoneWithAccessoriesAndSticker.Print(); Console.WriteLine(); } } }

위의 Program 류 코드 를 통 해 알 수 있 듯 이 클 라 이언 트 는 휴대 전화 부품 을 휴대 전화 에 동적 으로 추가 할 수 있 으 며, 다른 부품 을 추가 하려 면 Decorator 류 의 대응 류 를 계승 하 는 것 만 추가 하면 된다.장식 자 패턴 의 확장 성 이 매우 좋다 는 것 을 알 수 있다.
장식 자 모드 의 캐릭터
추상 적 인 구성 요소 역할 (phone): 추상 적 인 인 인 터 페 이 스 를 제공 하여 부가 책임 을 받 을 대상 을 규범화 시킨다.
구체 적 인 구성 요소 역할 (ApplePhone): 추가 책임 을 받 을 클래스 를 정의 합 니 다.
장식 역할 (Decorator): 구조물 대상 의 인 스 턴 스 를 가지 고 추상 적 인 구조물 인터페이스 와 일치 하 는 인 터 페 이 스 를 정의 합 니 다.
구체 적 인 장식 캐릭터 (Sticker 와 Accessories): 구조물 대상 에 게 부가 적 인 책임 을 추가 합 니 다.
장식 자 패턴 의 장단 점
장점:
  • 장식 자 모델 과 계승 은 모두 확장 대상 의 기능 이지 만 장식 자 모델 은 계승 보다 유연 하 다
  • 서로 다른 구체 적 인 장식 류 와 이런 유형의 배열 조합 을 사용 하면 디자이너 는 다양한 행위 의 조합 을 창조 할 수 있다
  • 장식 자 모드 가 좋 은 확장 성
  • 단점:
  •     장식 자 모델 은 디자인 에 작은 대상 이 많이 나타 나 고 과도 하 게 사용 하면 프로그램 을 더욱 복잡 하 게 만 들 수 있다.그리고 더 많은 대상 은 실수 가 어려워 질 것 이다. 특히 이들 대상 은 모두 비슷 해 보인다.

  • 필드 사용
  • 한 가지 기능 을 확장 하거나 한 가지 유형 에 추가 책임 을 져 야 한다.
  • 한 대상 에 게 동태 적 으로 기능 을 추가 해 야 하 는데 이런 기능 은 다시 동태 적 으로 취소 할 수 있다.
  • 일부 기본 기능 의 배열 조합 으로 인해 발생 하 는 매우 많은 기능
  • 을 증가 해 야 한다.
    총결산
    장식 자 모델 은 계승 이 아 닌 대상 조합 방식 으로 운영 할 때 대상 의 기능 을 동태 적 으로 확장 하 는 능력 을 실 현 했 고 수요 에 따라 여러 가지 기능 을 확대 하여 계승 이 가 져 온 '유연성 차이' 와 '다 자 류 파생' 문 제 를 단독으로 사용 하지 않도록 했다.또한 대상 을 대상 으로 하 는 디자인 원칙 에서 '상속 이 아 닌 대상 조합 우선 사용' 과 '개방 - 폐쇄' 원칙 에 잘 부합된다.

    좋은 웹페이지 즐겨찾기