访问者模式

访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

 这个描述比较晦涩,啥是对象结构,它的各元素又是啥。

我们先来看下访问者模式的类图:

 这个例子是一个关于企业用户和个人用户的例子,概念中的各元素在这里指的就是他俩,对象结构指的是上图的ObjectStructure,这样的设计就会在不改变企业用户和个人用户的前提下为这俩类增加或直接修改了它们的方法(在不改变各元素的类的前提下定义作用于这些元素的新操作)。

新操作就是在具体的访问者对象里实现的,上图里就是ServiceRequestVisitor服务请求和PredilectionAnalyzeVisitor偏好分析。

访问者模式能给一系列对象透明地添加新功能,从而避免在维护期间对这一系列对象进行修改,而且还能变相实现复用访问者所具有的功能。

访问者对象有其适用的范围,比如上述例子中,有企业用户和个人用户,并且一般很难再增加其他类型的用户(对象结构很少变动),试想如果再增加一个某某用户,是不是所有访问者对象都要再增加一个方法。

如果对象结构很少变动,但是需要经常给对象结构中的元素定义新的操作,可以使用访问者模式。

如果想对一个对象结构中的各个元素进行很多不同的且不相关的操作,为了避免这些操作使类变得杂乱,可以使用访问者模式把这些操作分散到不同的访问者对象中去,每一个访问者对象实现同一类功能。

客户端代码:

public class client
{
    public static void man(string[] args)
    {
        //创建ObjectStructure
        ObjectStructure os=new ObjectStructure();
        //向对象结构中加入元素
        Customer cm1=new EnterpriseCustomer();
        os.addElement(cm1);
        Customer cm2=new PersonalCustomer();
        os.addElement(cm2);
        //构建不同的访问者对象
        //客户请求
        ServiceRequestVisitor visitor1=new ServiceRequestVisitor();
        //执行客户请求新操作
        os.handleRequest(visitor1);
       //偏好分析
       PredilectionAnalyzeVisitor visitor2=new PredilectionAnalyzeVisitor();
       os.handleRequest(visitor2);
    }          
}

对象结构的handleRequest方法

public void handleRequest(Visitor visitor)
{
    //循环对象结构中的元素,接受访问
   for(Customer cm:col)
   {
       cm.accept(visitor);
   }
}

元素的accept方法

public class EnterpriseCustomer extends Customer
{
    public void accept(Visitor visitor)
    {
        //回调访问者对象的相应方法
        visitor.visitorEnterpriseCustomer(this);
    }
}

注意visitorEnterpriseCustomer方法中传入的this,这使得Visitor对象中可以访问EnterpriseCustomer对象的内容

Visitor的新操作方法

public class ServiceRequestVisitor implements Visitor
{
    public void visitEnterpriseCustomer(EnterpriseCustomer ec)
    {
        //企业客户提出的具体服务请求
        ec.getName();
    }  
    public void visitPersonalCustomer(PersonalCustomer pc)
    {
        //个人客户提出的具体服务请求
        pc.getName();
    }      
}

 

posted @ 2023-07-11 09:55  何塞穆里尼奥  阅读(18)  评论(0编辑  收藏  举报