디자인 모드 - 방문 자 모드

장면: 세상 에 사람과 동물 만 있다 고 가정 하면 사람과 동물 은 정서 가 많 고 정 서 를 표현 하 는 방식 이 다르다.
abstract class World
    {
        abstract public void DoSomething(State state);
    }
    class Person : World
    {
        public override void DoSomething(State state)
        {
            state.PersonDoSomething(this);//     
        }
    }
    class Animal : World
    {
        public override void DoSomething(State state)
        {
            state.AnimalDoSomething(this);
        }
    }
//  
abstract class State
    {
        public abstract void PersonDoSomething(World world);

        public abstract void AnimalDoSomething(World world);
    }
    class Happy : State
    {
        public override void AnimalDoSomething(World world)
        {
            Console.WriteLine("        ");
        }

        public override void PersonDoSomething(World world)
        {
            Console.WriteLine("       ");
        }
    }
    class Sad : State
    {
        public override void AnimalDoSomething(World world)
        {
            Console.WriteLine("        ");
        }

        public override void PersonDoSomething(World world)
        {
            Console.WriteLine("       ");
        }
    }
        //    
        class Context
    {
        List list = new List();
        public void Add(World w)
        {
            list.Add(w);
        }
        public void Remove(World w)
        {
            list.Remove(w);
        }
        public void Display(State state)
        {
            foreach (var item in list)
            {
                item.DoSomething(state);
            }
        }
    }
        //  :
        static void Main(string[] args)
        {
            World w1 = new Person();
            World w2 = new Animal();
            Context c = new Context();
            c.Add(w1);
            c.Add(w2);
            State h = new Happy();
            State s = new Sad();
            c.Display(h);
            c.Display(s);
            Console.Read();
        }

결론: 데이터 구조 가 안 정 될 때 만 그 를 사용 할 수 있다. 그렇지 않 으 면 원 소 를 증가 하면 개폐 원칙 을 파괴 할 수 있다.이 모드 는 원소 와 원소 의 상 태 를 분해 했다.브리지 모드 와 유사 하 다.확장 처리 방식 에 유리 합 니 다. 위의 코드 는 슬픔 과 기쁨 두 가지 정서 입 니 다. 기 존 코드 를 바 꾸 지 않 고 세 번 째 정 서 를 쉽게 추가 할 수 있 습 니 다.장점: 상태 와 구조 가 분리 되 어 상 태 를 확장 하기 쉽다.단점: 복잡 하고 데이터 구조 가 안정 적 인 경우 에 만 적용 된다.
브리지 모드 도 처리 와 구 조 를 분리 시 키 고 브리지 로 위의 코드 를 다음 과 같이 실현 한다.
abstract class World
    {
        abstract public void DoSomething(State state);
    }
    class Person : World
    {
        public override void DoSomething(State state)
        {
            state.DoSomething(this);
        }
    }
    class Animal : World
    {
        public override void DoSomething(State state)
        {
            state.DoSomething(this);
        }
    }
abstract class State
    {
        public abstract void DoSomething(World world);        
    }
    class Happy : State
    {
            //                (‘ ‘  ’ ’),   World   
        public override void DoSomething(World world)
        {
            Console.WriteLine("{0}      ",world.GetType().FullName);
        }        
    }
    class Sad : State
    {
        public override void DoSomething(World world)
        {
            Console.WriteLine("{0}      ", world.GetType().FullName);
        }        
    }
        //  
        static void Main(string[] args)
        {
            //World w1 = new Person();
            //World w2 = new Animal();
            //Context c = new Context();
            //c.Add(w1);
            //c.Add(w2);
            //State h = new Happy();
            //State s = new Sad();
            //c.Display(h);
            //c.Display(s);
            //Console.Read();

                 .    .World w1 = new      .    .Person();
                 .    .World w2 = new      .    .Animal();
                 .    .State s = new      .    .Happy();
                 .    .State s2 = new      .    .Sad();
            w1.DoSomething(s);
            w1.DoSomething(s2);
            w2.DoSomething(s);
            w2.DoSomething(s2);
            Console.Read();
        }

좋은 웹페이지 즐겨찾기