학습 노트 3 구조 형 모델

16982 단어 디자인 모드
구조 형 패턴
기 존 클래스 나 대상 을 어떻게 조직 하여 더욱 강력 한 구 조 를 형성 하 는 지 주목 하 다.
구조 형 모델 은 두 가지 물건 을 묘사 할 수 있다. 유형, 유형의 실례 (대상) 이기 때문에 구조 형 모델 은 유형 구조 형 모델, 대상 구조 형 모델 로 나 눌 수 있다.
클래스 구조 형 모델: 관심 클래스 의 조합 은 여러 가지 유형 으로 더 큰 시스템 (계승 과 실현 관계) 대상 구조 형 모델 로 구성 된다. 관심 클래스 와 대상 의 조합 은 관련 관 계 를 통 해 한 클래스 에서 다른 유형의 실례 대상 을 정의 한 다음 에 이 대상 을 통 해 해당 하 는 방법 을 사용한다.
합성 복용 원칙 에 따라 시스템 에서 가능 한 한 관련 관 계 를 사용 하여 계승 관 계 를 대체 하기 때문에 대부분의 구조 형 모델 은 대상 구조 형 모델 이다
7 가지 구조 형 모델
정의.
어댑터 모드 (어댑터)
하나의 인 터 페 이 스 를 고객 이 원 하 는 다른 인터페이스 로 변환 합 니 다.어댑터 모드 는 호 환 되 지 않 는 클래스 들 이 함께 작업 할 수 있 도록 합 니 다.
브리지 모드 (Bridge)
추상 적 인 부분 과 실현 부분 을 결합 시 켜 이들 이 독립 적 으로 변화 할 수 있 도록 한다.
조합 모드 (Composite)
여러 대상 을 조합 하여 나무 구 조 를 형성 하여 부분 - 전체 관계 의 차원 구 조 를 나타 낸다.조합 모델 은 고객 으로 하여 금 단일 대상 과 조합 대상 을 통일 적 으로 대 할 수 있 게 한다.
장식 모드 (장식 자)
동태 적 으로 한 대상 에 게 추가 적 인 직책 을 늘리다.확장 기능 에 있어 장식 모델 은 하위 클래스 를 사용 하 는 것 보다 더욱 유연 한 대체 방안 을 제공 했다.
외관 모드 (Facade)
서브 시스템 의 인터페이스 에 통 일 된 입 구 를 제공 합 니 다.외관 모드 는 고 층 인 터 페 이 스 를 정의 합 니 다. 이 인 터 페 이 스 는 이 서브 시스템 을 더욱 쉽게 사용 할 수 있 습 니 다.
메타 모드 (Flyweight)
공유 기술 을 활용 하여 대량의 입자 대상 의 재 활용 을 효과적으로 지원 하 다.
프 록 시 모드 (프 록 시)
대상 에 게 프 록 시 나 자리 표시 자 를 제공 하고 프 록 시 대상 이 원래 대상 에 대한 접근 을 제어 합 니 다.
통속판
7 가지 구조 형 모델
정의.
어댑터 모드 (어댑터)
쉽게 말 하면 관련 관계 의 응용 으로 특별한 것 이 없고 평소에 사용 해도 누가 어댑터, 어댑터 인지 강제로 구분 하지 않 는 다.
브리지 모드 (Bridge)
쉽게 말 하면 두 개의 계승 구조 가 있 고 이들 은 관련 관계 가 있다 (예 를 들 어 기능 과 BUFF) (관련 은 바로 '다리').
조합 모드 (Composite)
쉽게 말 하면 잎, 용기 가 있 고 같은 추상 류 를 계승 하여 클 라 이언 트 로 하여 금 추상 적 인 프로 그래 밍 을 할 수 있 게 한다. 조작 하 는 것 이 잎 인지 용기 인지 에 관심 을 가 질 필요 가 없다 (키워드 - 나무 구조, 부분 - 전체 관계, 잎, 용기, 재 귀).
장식 모드 (장식 자)
쉽게 말 하면 장식 류 에 주입 하 는 방식 으로 일반적인 구 조 를 장식 류 에 넣 고 장식 류 에 재 작성 하 는 방법 (클 라 이언 트 가 사용 하 는 것 은 장식 류 대상 이다. 이렇게 쓰 는 직책 이 명확 하지 않 고 일반 류 에 장식 류 대상 을 주입 하 는 것 이 낫다 고 생각한다) (물론 장식 모델 의 장점 은 2 차 장식, 3 차 장식 이 가능 하 다 는 것 이다)(스 킬 효과 가 많아 장식 모드 를 고려 해 야 하지 않 을 까...)
외관 모드 (Facade)
쉽게 말 하면 하나의 외관 류 로 다른 클래스 (서브 시스템) 의 업무 방법 을 이 유형의 한 방법 에 밀봉 하여 직접 호출 을 제공 하 는 것 이다.
메타 모드 (Flyweight)
프 록 시 모드 (프 록 시)
프 록 시 클래스 에서 실제 테마 클래스 의 대상 을 참조 하고 이 대상 을 통 해 실제 테마 클래스 를 호출 하 는 방법 으로 프 록 시 클래스 는 업 무 를 확장 하여 클 라 이언 트 가 호출 할 수 있 습 니 다.
어댑터 모드
하나의 인 터 페 이 스 를 고객 이 원 하 는 다른 인터페이스 로 변환 합 니 다. 어댑터 모드 는 호 환 되 지 않 는 클래스 가 함께 작업 할 수 있 도록 합 니 다.
그냥 연관 관계 야. 특별한 거 없어............................................................
public abstract class Target
{
    public abstract void Request(){}
}

//      ,            
public class Adaptee
{
    public void SpecifyRequest(){}
}

//   ,       ,   Adaptee   Target
public class Adapter : Target
{
    private Adaptee daptee;
    public Adapter(Adaptee adp)
    {
        this.adaptee = adp;
    }

    public override void Request()
    {
        adptee.SpecifyRequest();   //    
    }
}

예 를 들다
//  (   、  )
interface ScoreOperation
{
    int[] Sort(int[] array);
    int Search(int[] array,int key);
}

//   1
public class QuickSortClass
{
    public int[] QickSort(int[] array){...}
}
//   2
public class BinarySearchClass
{
    public int Search(int[] array,int key){...}
}
//   
public class OperationAdapter : ScoreOperation
{
    private QuickSortClass sort;
    private BinarySearchClass search;

    public OperationAdapter()
    {
        sort = new QuickSortClass();
        search = new BinarySearchClass();
    }

    public int[] Sort(int[] array) { return sort.QuickSort(array); }

    public int Search(int[] array,int key) { return search.BinarySearch(array,key); }
}


브리지 모드
브리지 모드 (Bridge) - 추상 적 인 부분 과 실현 부분 을 결합 시 켜 이들 이 독립 적 으로 변화 할 수 있 도록 한다.
만약 에 시스템 에 두 개의 독립 적 인 변화 차원 이 존재 한다 면 브리지 모델 은 이 두 차원 을 분리 시 켜 이들 이 독립 적 으로 확장 할 수 있 도록 할 수 있다.
브리지 모델 은 교묘 한 방식 으로 다 층 계승 에 존재 하 는 문제점 을 처리 하고 추상 적 인 관 계 를 통 해 전통 적 인 다 층 계승 을 대체 하 며 유형 간 의 정태 적 계승 관 계 를 동태 적 인 대상 조합 관계 로 전환 시 켜 시스템 을 더욱 유연 하고 확장 하기 쉬 우 며 시스템 중의 개 수 를 효과적으로 제어 한다.
브리지 모델 을 사용 할 때 사용 자 는 먼저 두 가지 독립 적 인 변화 차원 을 식별 하고 이 를 두 가지 독립 적 으로 변화 하 는 계승 등급 구조 로 설계 하여 두 가지 차원 에 추상 적 인 층 을 제공 하고 추상 적 인 결합 을 구축 해 야 한다. 일반적인 상황 에서 두 가지 독립 적 인 변화 차원 을 가 진 일반 업무 방법 과 그 와 가장 밀접 한 관 계 를 가 진 차원 을 설정 해 야 한다.'추상 류' 차원 구조 (추상 부분) 로 계산 하고 다른 차원 을 '실현 류' 차원 구조 (실현 부분) 로 설계 한다.
쉽게 말 하면 두 개의 계승 구조 가 있 고 이들 은 관련 관계 가 있다 (예 를 들 어 스 킬 과 BUFF).
public abstract class Abstraction
{
    protected Implementor imp;    //         

    public void SetImp(Implementor impl)
    {
        this.imp = impl;
    }

    public abstract void Operation();   //        
}


public class RefinedAbstraction : Abstraction
{
    public override void Operation()
    {
        imp.Operation();  //        
        //      ..........
    }
}


interface Implementor
{
    void OperationImpl();
}

public class ConcreteImplementor : Implementor
{
    public void OperationImpl()
    { ... }
}

조합 모드
조합 모델 은 잎 구조 재 와 용기 구조 재 를 포함 하 는 구조 와 그들의 조직 형 태 를 주목 하고 잎 구조 재 에는 구성원 대상 이 포함 되 지 않 으 며 용기 구조 재 에는 구성원 대상 이 포함 되 어 있 으 며 이런 대상 들 은 재 귀 조합 을 통 해 하나의 나무 구 조 를 구성 할 수 있다.
조합 모델 은 잎 구조 재 와 용기 구조 재 에 공공 추상 적 인 구조 재 류 를 제공 하고 클 라 이언 트 는 추상 적 인 구조 재 를 처리 할 수 있 으 며 조작 대상 의 잎 구조 재 든 용기 구조 재 든 관심 을 가 질 필요 가 없다.
키워드 - 나무 구조, 부분 - 전체 관계, 잎, 용기, 재 귀,
public abstract class Component
{
    public abstract void Operation();
}

public class Leaf : Component
{
    public override void Operation() 
    { ............ }
}

public class Container : Component
{
    //                 ,     list

    private List list = new List();  //         

    public abstract void Add(Component c){}
    public abstract void Remove(Component c){}
    public abstract Component GetChild(int i){}

    public override void Operation()
    {
        foreach(Component comp in list)
        {
            comp.Operation();  //  ,         Operation
        }
    }
}


장식 모드
장식 모델 은 계승 을 대체 하 는 기술 로 서브 클래스 를 정의 할 필요 가 없 는 방식 으로 대상 에 게 동태 적 으로 직책 을 증가 시 키 고 대상 간 의 관련 관 계 를 사용 하여 클래스 간 의 계승 관 계 를 대체 하 는 것 이다.
장식 모델 은 시스템 의 결합 도 를 낮 추고 대상 의 직책 을 동태 적 으로 증가 하거나 삭제 할 수 있 으 며 '장식 이 필요 한 구체 적 인 구조 재 류' 와 '장식 에 사용 되 는 구체 적 인 장식 류' 를 독립 적 으로 변화 시 킬 수 있다. (약간 브리지 모델 처럼 들린다)
장식 모델 은 대상 자체 의 기능 을 바 꾸 지 않 는 토대 에서 대상 에 게 추가 적 인 새로운 행 위 를 추가 할 수 있다.
쉽게 말 하면 장식 류 에 주입 하 는 방식 으로 일반적인 구 조 를 장식 류 에 넣 고 장식 류 에 재 작성 하 는 방법 (이렇게 쓰 는 직책 이 명확 하지 않 으 면 일반 류 에 장식 류 대상 을 주입 하 는 것 이 낫다 고 생각 합 니 다) if (decorator! = null) {...}

abstract class Component
{
    public abstract void Operation();
}

class ConcreteComponent : Component
{
    public override void Operation(){...}
}

class Decorator : Component
{
    private Component component;    //                  (              )

    public Decorator(Component comp)
    {
        this.component = comp;
    }
    public override void Operation()
    {
        component.Operation();
    }
}

class ConcreteDecorator : Decorator
{
    public ConcreteDecorator(Compnent component) : base(component){}

    public override void Operation()
    {
        base.Operation(); //        
        AddBehavour();    //        
    }

    public void AddBehaviour()
    {...}
}

//     
Component comp = new ConcreteComponent();
Component compAdditive = new ConcreteDecorator(comp);//    

compAdditive.Operation();//         、    

//                。。。。。。

외관 모드
외관 모드 - 서브 시스템 의 인터페이스 에 통 일 된 입 구 를 제공 합 니 다. 외관 모드 는 고 층 인 터 페 이 스 를 정의 합 니 다. 이 인 터 페 이 스 는 이 서브 시스템 을 더욱 쉽게 사용 할 수 있 습 니 다.
하나의 외관 역할 을 도입 하여 클 라 이언 트 와 서브 시스템 간 의 상호작용 을 간소화 하고 복잡 한 서브 시스템 호출 에 통 일 된 입 구 를 제공 하여 서브 시스템 과 클 라 이언 트 의 결합 도 를 낮 추고 클 라 이언 트 호출 이 매우 편리 하 다.
외관 류 는 소프트웨어 시스템 의 '종업원' 역할 을 하고 여러 업무 류 의 호출 에 통 일 된 입 구 를 제공 하 며 유형 과 유형 간 의 상호작용 을 간소화 했다.
외관 모델 에서 상호작용 이 필요 한 업무 유형 을 서브 시스템 이 라 고 부른다.
class SubSystemA
{
    public void MethodA(){...}
}

//.....

public class Facade
{
    private SubSystemA a = new SubSystemA();
    private SubSystemB b = new SubSystemB();
    private SubSystemC c = new SubSystemC();

    //          ,         
    public void Method()     
    {
        a.MethodA();
        b.MethodB();
        c.MethodC();
    }
}

//     
Facade facade = new Facade();
facade.Method();


향원 모드
향 원 모델 - 공유 기술 을 활용 하여 대량의 입자 대상 의 재 활용 을 효과적으로 지원 합 니 다.
에이전트 모드
프 록 시 모드 - 대상 에 게 프 록 시 나 자리 표시 자 를 제공 하고 프 록 시 대상 이 원래 대상 에 대한 접근 을 제어 합 니 다.
사용자 가 특정한 대상 을 직접 방문 하지 못 하거나 특정한 대상 을 방문 하 는 데 어려움 이 있 을 때 하나의 대리 대상 을 통 해 간접 적 으로 방문 할 수 있 습 니 다. 클 라 이언 트 가 사용 하 는 투명 성 을 확보 하기 위해 방문 하 는 실제 대상 과 대리 대상 은 똑 같은 인 터 페 이 스 를 실현 해 야 합 니 다.
일반적으로 대리 류 와 실제 주제 류 는 추상 적 인 주제 류 에서 계승 한 다음 에 대리 류 는 실제 주제 류 에 대한 인용 을 유지 하고 대리 류 는 실제 주제 류 보다 더 많은 일 을 하기 때문에 최종 적 으로 대리 류 의 대상 으로 호출 된다.
본인 이해: 프 록 시 는 많은 장점 이 있 습 니 다. 예 를 들 어 이미 달리 고 있 는 시스템 에 문제 가 생 겼 습 니 다. 우 리 는 프 록 시 모드 를 사용 하거나 소스 코드 를 직접 수정 합 니 다. 소스 코드 를 직접 수정 하 는 가장 큰 위험 은 다른 시스템 기능 에 예측 할 수 없 는 오 류 를 초래 하 는 것 입 니 다. 그러나 프 록 시 모드 를 통 해 오류 부위 에서 차단 한 다음 에 오 류 를 수정 하고 프로그램 을 계속 실행 하 는 것 과 같 습 니 다.따라서 낡은 시스템 에 어떠한 피 해 를 주지 않 는 다. 대 리 는 그 중에서 '교량 역할' 을 한다.
public abstract class Subject
{
    public abstract void Request();
}

public class RealSubject : Subject
{
    public override void Request(){...}
}

public class Proxy : Subject
{
    private RealSubject realSubject = new RealSubject();

    public void PreRequest(){...}   //             
    public void PostRequest(){...}

    public override void Request()
    {
        PreRequest();
        realSubject.Request();
        PostRequest();
    }
}

//         ,                

좋은 웹페이지 즐겨찾기