visitor(访问者)模式

None.gif using  System;
None.gif
None.gif
namespace  Visitor
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public abstract class Animal
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public void Run()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"I'm running!");
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
public abstract void Accept(AnimalVisitor visitor);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public class Dog:Animal
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public override void Accept(AnimalVisitor visitor)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            visitor.Visit(
this);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public class Cat:Animal
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public override void Accept(AnimalVisitor visitor)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            visitor.Visit(
this);
ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public abstract class AnimalVisitor
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public abstract void Visit(Dog animal);
InBlock.gif        
public abstract void Visit(Cat animal);
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public class MyVisitor:AnimalVisitor
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public override void Visit(Cat animal)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"Cat's new method");
ExpandedSubBlockEnd.gif        }

InBlock.gif        
public override void Visit(Dog animal)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"Dog's new method");
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
public class JumpVisitor:AnimalVisitor
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public override void Visit(Cat animal)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"Cat is jumping!");
ExpandedSubBlockEnd.gif        }

InBlock.gif        
public override void Visit(Dog animal)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Console.WriteLine(
"Dog is jumping!");
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
public class App
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Animal[] animals 
= new Animal[2];
InBlock.gif            animals[
0= new Dog();
InBlock.gif            animals[
1= new Cat();
InBlock.gif            animals[
0].Accept(new MyVisitor());
InBlock.gif            animals[
0].Accept(new JumpVisitor());
InBlock.gif            animals[
1].Accept(new MyVisitor());
InBlock.gif            animals[
1].Accept(new JumpVisitor());
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
    这里只是我学习设计模式一个笔记式的记录,在这里我不过多的介绍这个模式,有许多人写的好,
我个人比较喜欢吕震宇的博客( www.cnblogs.com/zhenyulu)。
    这是我学习访问模式时自己做的一个小例子,访问者模式是为了使你在不改变各元素的类的前提
下定义作用于这些元素的新操作。
    在我的这个例子里,基类animal只有一个默认的方法Run(),子类继承时获得了这个方法,子类也可
以覆写这个方法,但是这种方式会导致一个问题,就是无法动态辨析子类,调用合适的方法,如果
要加入多态特性的话,就要用到虚方法或抽象方法,这里这个Run()只是个示例,也许这样用并不合
适。
    现在回到正题,如果要给这个类层次体系统一填加一个方法,我们可以修改源代码,在基类中加
入一个抽象方法,子类来实现这个方法,但是这样违背了“开--闭原则”,所以这里引入了访问者
角色,不同的具体的访问者角色表示不同的行为,通过两次多态的动态辨析,为特定的子类填加了
特定的方法。当有新的行为要填加时,只需继承抽象访问者角色,建立一个新的具体的访问者类即
可。
    任何设计模式都不是万能的,设计模式是为了应对变化,封装变化。每一个论计模式都有自己适
用的情况,但没有万能的设计模式,我们总是假设什么是变的,什么是不变的,在项目设计初期,
我们要预计将来,什么变什么不变,从而进行良好的设计应对变化。
    在访问者模式里,我们把类层次结构看做不变的,而类层次结构的形为是多变的,如果类层次结
构变化的话,我们就要修改任何一个访问者类,这是我们所不想看到的

转载于:https://www.cnblogs.com/whzh/archive/2007/05/20/753122.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值