享受代码,享受人生

SOA is an integration solution. SOA is message oriented first.
The Key character of SOA is loosely coupled. SOA is enriched
by creating composite apps.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Double Dispatch Game Example

Posted on 2006-02-03 21:57  idior  阅读(1049)  评论(0编辑  收藏  举报

Bad Way:

    interface Monster    {}

    
class Drawf : Monster    {}

    
class Giant : Monster    {}
    
    
class Door
    {
        
public virtual void OpenBy(Monster monster)
        {
            Console.WriteLine(
"Who are u?");
        }

        
public virtual void OpenBy(Drawf dwarf)
        {
            Console.WriteLine(
"It's slowly opened");
        }

        
public virtual void OpenBy(Giant giant)
        {
            Console.WriteLine(
"It's just easily brokenCrasp!");
        }
    }

    
class HeavyDoor : Door
    {
        
public override void OpenBy(Drawf dwarf)
        {
            Console.WriteLine(
"It won't open");
        }

        
public override void OpenBy(Giant giant)
        {
            Console.WriteLine(
"It's slowly opened");
        }
    }


    
class Game
    {
        
static void Main()
        {
            Door ironDoor 
= new HeavyDoor();
            List
<Monster> monsters = new List<Monster>();
            monsters.Add(
new Drawf());
            monsters.Add(
new Giant());

            
foreach (Monster m in monsters)
                 ironDoor.OpenBy(m);
        }
    }

Double-Dispatch Way:

    interface Monster
    {
        
void Open(Door d);
    }

    
class Drawf : Monster
    {
        
public void Open(Door d)
        {
            d.OpenBy(
this);
        }
    }

    
class Giant : Monster
    {        
        
public void Open(Door d)
        {
            d.OpenBy(
this);
        }
    }

    class Door
    {
        
public virtual void OpenBy(Monster monster)
        {
            Console.WriteLine(
"Who are u?");
        }

        
public virtual void OpenBy(Drawf dwarf)
        {
            Console.WriteLine(
"It's slowly opened");
        }

        
public virtual void OpenBy(Giant giant)
        {
            Console.WriteLine(
"It's just easily brokenCrasp!");
        }
    }

    
class HeavyDoor : Door
    {
        
public override void OpenBy(Drawf dwarf)
        {
            Console.WriteLine(
"It won't open");
        }

        
public override void OpenBy(Giant giant)
        {
            Console.WriteLine(
"It's slowly opened");
        }
    }  

   
    
class Game
    {
        
static void Main()
        {
            Door ironDoor 
= new HeavyDoor();
            List
<Monster> monsters = new List<Monster>();
            monsters.Add(
new Drawf());
            monsters.Add(
new Giant());

            
foreach (Monster m in monsters)
                m.Open(ironDoor);         
        }
    }

Reflection Way:
    interface Monster    {}

    
class Drawf : Monster    {}

    
class Giant : Monster    {}
    
    
class Door
    {
        
public virtual void OpenBy(Monster monster)
        {
            Type[] types 
= new Type[] { monster.GetType() };

            MethodInfo mi 
= this.GetType().GetMethod("OpenBy", types);

            
if (mi == null)
                Console.WriteLine(
"Who are u?");
            
else
                mi.Invoke(
thisnew object[] { monster });
        }

        
public virtual void OpenBy(Drawf dwarf)
        {
            Console.WriteLine(
"It's slowly opened");
        }

        
public virtual void OpenBy(Giant giant)
        {
            Console.WriteLine(
"It's just easily brokenCrasp!");
        }
    }

    
class HeavyDoor : Door
    {
        
public override void OpenBy(Drawf dwarf)
        {
            Console.WriteLine(
"It won't open");
        }

        
public override void OpenBy(Giant giant)
        {
            Console.WriteLine(
"It's slowly opened");
        }
    }


    
class Game
    {
        
static void Main()
        {
            Door ironDoor 
= new HeavyDoor();
            List
<Monster> monsters = new List<Monster>();
            monsters.Add(
new Drawf());
            monsters.Add(
new Giant());

            
foreach (Monster m in monsters)
                 ironDoor.OpenBy(m);
        }
    }