디자인 모드 시리즈 - 장식 모드
우 리 는 이 1 초 동안 변화 하 는 세상 에 살 고 있 습 니 다. 때로는 우정 이 사랑 보다 더 믿 을 수 있 습 니 다. 친 구 는 당신 이 가장 힘 들 때 묵묵히 당신 의 모든 평안 을 지 킬 수 있 습 니 다.정 은 빠르게 두 진영 으로 변 한다! 우 리 는 모두 사랑 이 필요 하 다. 우리 모두 우정 이 필요 한 것 처럼 우 리 는 이 세상 에서 끊임없이 찾 고 있다. 왜냐하면 우 리 는 하나 가 없어 서 는 안 되 기 때문이다.
1. 장면 시 뮬 레이 션
이렇게 해서 이 씨 를 떠 올 리 게 한다. 나 와 이 씨 는 아주 친 한 친구 이다. 물론 그 는 나 답지 않 고 홀아비 이기 때문에 그 는 우정 과 사랑 만 있 는 것 이 아니다. 그러나 최근 며칠 동안 그들 이 싸 웠 다. 무슨 원인 이 있 니?더 이상 말 하지 않 겠 습 니 다. 어쨌든 남자 인 이 씨 는 스스로 잘못 을 인정 하고 여 자 를 만회 하기 로 결 정 했 습 니 다. 하지만 여자 가 데이트 처럼 아름 답 지 않 은 것 을 만회 하 는 것 은 한편 입 니 다. 중요 한 것 은 사과 의 성의 입 니 다. 예 를 들 어 사과 편지 한 통, 장미꽃 한 다발, 첫 번 째 여자 가 보 낸 스카프 를 가지 고 성 의 를 표시 하 는 것 등 입 니 다.나 는 이런 차 림 에 성실한 태 도 를 더 하면 반드시 성공 적 으로 돌아 올 것 이 라 고 생각한다.
그러면 우 리 는 코드 로 실현 합 시다.
- public class MrLi
- {
- private const string name = "limou";
-
- ///
- ///
- ///
- public void Letters()
- {
- Console.Write(" ");
- }
-
- ///
- ///
- ///
- public void Rose()
- {
- Console.Write(" ");
- }
-
- ///
- ///
- ///
- public void Scarf()
- {
- Console.Write(" ");
- }
-
- ///
- ///
- ///
- public void Operation()
- {
- Console.WriteLine(" :");
- this.Letters();
- this.Rose();
- this.Scarf();
- }
- }
- static void Main(string[] args)
- {
- MrLi li = new MrLi();
- //
- li.Operation();
- Console.WriteLine();
- }
실행 결 과 는 다음 과 같 습 니 다.
이상 의 코드 를 완성 하 자마자 이 씨 의 전 화 를 받 고 성공 했다 고 말 했다. 이 방법 으로 정말 효과 가 있 구나. 그럼 우리 내일 저녁 에 밥 을 먹고 축하 하 자.이 씨 가 말 했다. "안 돼. 우 리 는 방금 화 해 했 어. 내일 저녁 에 나 는 내 여자 친구 밖 에 없어. 나 는 그녀 와 함께 밥 을 먹 을 거 야!" 나 는 어 지 러 워, 무 거 운 색 의 가 벼 운 친구 야!
그럼 그 는 내일 여자친 구 와 데 이 트 를 할 때 다 시 는 이런 식 으로 하지 않 을 것 이다. 틀림없이 쓸모 가 없 을 것 이다. 만약 그 가 내일 계속 장미꽃 을 가지 고 선글라스 와 목도 리 를 가지 고 간다 면?이 럴 때 우리 가 방금 실현 한 클래스 는 만족 할 수 없 을 것 같은 데 어 떡 하지?최 악의 방법 은 MrLi 류 에 선 글 라 스 를 끼 우 는 방법 을 넣 는 것 이다. 왜 최 악의 방법 일 까?대상 지향 원칙 중의 개방 - 폐쇄 원칙 을 어 겼 기 때문이다.그렇다면 개방 폐쇄 원칙 은 무엇 일 까?
개방 폐쇄 원칙: 클래스 는 확장 할 수 있 지만 수정 할 수 없습니다.
그렇다면 MrLi 의 분장 을 어떻게 지원 할 수 있 을 까?서 두 르 지 말고 먼저 장식 모드 를 보 세 요!
2. 장식 모드
장식 모델: 장식 모델 은 동태 적 으로 대상 에 게 책임 을 증가 하 는 것 이다. 확장 기능 에 있어 장식 모델 은 계승 보다 더욱 유연 한 방안 을 제공 했다.
장식 모드 유형 도 는 다음 과 같다.
Component 류: 추상 적 인 장식 대상 과 피 장식 대상 의 공 통 된 장식 행위.
Concrete Component 클래스: 장 식 된 주 대상 입 니 다.
Decorator 클래스: 장식 용 추상 클래스 로 Component 클래스 의 인 스 턴 스 와 장식 대상 과 의 공동 행 위 를 포함 하고 Component 클래스 의 인 스 턴 스 를 포함 하여 미래의 구체 적 인 장식 유형 이 모두 명확 한 장식 대상 이 있다 는 것 을 나타 낸다.
ConcreteDecrator A 와 ConcreteDecrator B 클래스: 구체 적 인 장식 클래스 의 실례 입 니 다. 이 대상 은 추상 적 인 Decorator 클래스 를 실 현 했 고 장식 대상 을 포함 하여 이 대상 을 장식 합 니 다.
장식 모드 코드 는 다음 과 같 습 니 다.
- ///
- ///
- ///
- public abstract class Component
- {
- //
- public abstract void Operation();
- }
-
- ///
- ///
- ///
- public class ConcreteComponent : Component
- {
- public override void Operation()
- {
- Console.WriteLine(" ");
- }
- }
-
- ///
- ///
- ///
- public abstract class Decorator : Component
- {
- protected Component component;
-
- public void SetComponent(Component component)
- {
- this.component = component;
- }
-
- public override void Operation()
- {
- if (component != null)
- {
- component.Operation();
- }
- }
- }
-
- ///
- ///
- ///
- public class ConcreteDecoratorA : Decorator
- {
- private void AddedBehaviorA()
- {
- Console.WriteLine(" A");
- }
-
- public override void Operation()
- {
- base.Operation();
- AddedBehaviorA();
- }
- }
-
- public class ConcreteDecoratorB : Decorator
- {
- private void AddedBehaviorB()
- {
- Console.WriteLine(" B");
- }
-
- public override void Operation()
- {
- base.Operation();
- AddedBehaviorB();
- }
- }
주 함수 호출 은 다음 과 같 습 니 다:
- static void Main(string[] args)
- {
- //
- ConcreteComponent cc = new ConcreteComponent();
- // A
- ConcreteDecoratorA cda = new ConcreteDecoratorA();
- // A
- ConcreteDecoratorB cdb = new ConcreteDecoratorB();
-
- // A cc
- cda.SetComponent(cc);
- // B A
- cdb.SetComponent(cda);
- //
- cdb.Operation();
-
- //
- // B cc
- cdb.SetComponent(cc);
- // A B
- cda.SetComponent(cdb);
- //
- cda.Operation();
- }
이 를 통 해 알 수 있 듯 이 장식 모델 이 있 으 면 우 리 는 장식 대상 을 쉽게 늘 리 고 유연 하 게 조직 장식 대상 의 분장 순 서 를 정할 수 있다. 만약 에 우리 가 장식 모델 로 우리 의 첫 번 째 부분 장면 을 실현 한다 면 어떻게 해 야 할 까?
3. 장식 모델 의 유연 한 활용
그러면 우리 가 디자인 한 유 도 는 다음 과 같다.
코드 구현 은 다음 과 같 습 니 다.
- ///
- ///
- ///
- public abstract class DressUp
- {
- //
- public abstract void ToDressUp();
- }
-
- ///
- /// , ,
- ///
- public class MrLi : DressUp
- {
- private const string name = "limou";
-
- ///
- ///
- ///
- public override void ToDressUp()
- {
- Console.WriteLine("{0} :",name);
- }
- }
-
- ///
- ///
- ///
- public abstract class Decorator:DressUp
- {
- //
- protected DressUp component = null;
-
- ///
- ///
- ///
- ///
- public void SetDressUp(DressUp com)
- {
- this.component = com;
- }
-
- ///
- ///
- ///
- public override void ToDressUp()
- {
- if (component != null)
- {
- component.ToDressUp();
- }
- }
- }
-
- ///
- ///
- ///
- public class Letters : Decorator
- {
- ///
- ///
- ///
- public override void ToDressUp()
- {
- base.ToDressUp();
- Console.Write(" ");
- }
- }
-
- ///
- ///
- ///
- public class Rose : Decorator
- {
- ///
- ///
- ///
- public override void ToDressUp()
- {
- base.ToDressUp();
- Console.Write(" ");
- }
- }
-
- ///
- ///
- ///
- public class Scarf : Decorator
- {
- ///
- ///
- ///
- public override void ToDressUp()
- {
- base.ToDressUp();
- Console.Write(" ");
- }
- }
-
- ///
- /// ,
- ///
- public class Sunglasses :Decorator
- {
- ///
- ///
- ///
- public override void ToDressUp()
- {
- base.ToDressUp();
- Console.Write(" ");
- }
- }
주 함수 호출 은 다음 과 같 습 니 다:
- static void Main(string[] args)
- {
- MrLi li = new MrLi();
-
- //
- Console.WriteLine(" :");
- //
- Letters letters = new Letters();
- //
- Rose rose = new Rose();
- //
- Scarf scarf = new Scarf();
-
- //
- letters.SetDressUp(li);
- //
- rose.SetDressUp(letters);
- //
- scarf.SetDressUp(rose);
- //
- scarf.ToDressUp();
- Console.WriteLine();
- Console.WriteLine("--------------------------------------");
- //
- Console.WriteLine(" ");
- //
- Letters let = new Letters();
- //
- Sunglasses sunglasses = new Sunglasses();
- //
- Scarf sca = new Scarf();
-
- //
- let.SetDressUp(li);
- //
- sunglasses.SetDressUp(let);
- //
- sca.SetDressUp(sunglasses);
- //
- sca.ToDressUp();
- Console.WriteLine();
- }
실행 결 과 는 다음 과 같 습 니 다.
이렇게 장식 모델 을 이용 하면 앞으로 새로운 장식품 에 대한 확장 을 효과적으로 해결 할 수 있 고 원래 의 종 류 를 수정 하지 않 아 도 개방 폐쇄 원칙 을 완전히 만족 시 킬 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
양식 제출 후 제출 버튼 비활성화텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.