设计模式学习与实践(二十五)----访问者模式(visitor)

1.1.1        描述

l         正规描述

访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。当使用访问者模式时,要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

l         形象描述

情人节到了,要给每个MM送一束鲜花和一张卡片,可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor,让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,这样就轻松多了。

1.1.2        类图&示意代码

public interface Visitor(){

void visit1(Visitable visitElement);

void visit2(Visitable visitElement);

}

 

public class ConcreteVisitor implements Visitor(){

public void visit1(Visitable visitElement){

    visitElement.Operation1();

}

 

public void visit2(Visitable visitElement){

    visitElement.Operation2();

}

}

 

public interface Visitable(){

void accept1(Visitor visitor);

void accept2(Visitor visitor);

void Operation1();

void Operation2();

}

 

public class ConcreteElement1 implements Visitable(){

public void accept1(Visitor visitor){

    visitor.visit1(this);

}

 

public void accept2(Visitor visitor){

    visitor.visit2(this);

}

 

public void Operation1(){

    //to do

}

 

public void Operation2(){

    //to do

}

}

 

public class ConcreteElement2 implements Visitable(){

public void accept1(Visitor visitor){

    visitor.visit1(this);

}

 

public void accept2(Visitor visitor){

    visitor.visit2(this);

}

 

public void Operation1(){

    //to do

}

 

public void Operation2(){

    //to do

}

}

 

public class Client(){

public void main(String args[]){

    Visitor visitor = new ConcreteVisitor();

    Vector<Visitable> visitableElements = new Vector();

    visitableElements.add(new ConcreteElement1());

    visitableElements.add(new ConcreteElement2());

   

    for(Enumeration e = visitableElements.elements();e.hasMoreElements()){

        visitableElement = (Visitable)e.nextElement();

        visitableElement.accept1(visitor);

}

 

for(Enumeration e = visitableElements.elements();e.hasMoreElements()){

        visitableElement = (Visitable)e.nextElement();

        visitableElement.accept2(visitor);

}

}

}

 

1.1.3        举例

1.1.4        比较

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值