23种设计模式(9):访问者模式

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:16   1668   0

类图



场景


委任了一位访问者(Visitor),负责在客户进门时,询问他要办理什么业务,告诉他应该去哪个窗口办理。这样,每个窗口的业务员就只负责一项业务,减少了在不同业务间切换的时间耗费 ,效率大大提高。更重要的是,当某一项业务的处理流程发生变更时,不需要同时麻烦三个窗口的业务员,而只需要让处理这项业务的业务员进行修改就可以了 。

Java代码


public class Visitor {  
    public void process(Service service){  
        // 基本业务  
        System.out.println("基本业务");  
    }  
    public void process(Saving service){  
        // 存款  
        System.out.println("存款");  
    }  
      
    public void process(Draw service){  
        // 提款  
        System.out.println("提款");  
    }  
      
    public void process(Fund service){  
        System.out.println("基金");  
        // 基金  
    }  
}   

服务接口


package visitor;  
  
public interface Service {  
    public void accept(Visitor visitor);  
}  

存款


class Saving implements Service {  
  
public void accept(Visitor visitor) {  
      
    visitor.process(this);  
}  

取款


public class Draw implements Service {  
  
    public void accept(Visitor visitor) {  
      
        visitor.process(this);  
    }  
  
}

基金


public class Fund implements Service {  
  
    public void accept(Visitor visitor) {  
      
        visitor.process(this);  
    }  
  
}  


public class Test {  
    //访问者模式实现方法  
    public static void main(String[] args) {    
        Service s1 = new Saving();    
        Service s2 = new Draw();    
        Service s3 = new Fund();    
            
        Visitor visitor = new Visitor();    
            
        s1.accept(visitor);    
        s2.accept(visitor);    
        s3.accept(visitor);    
    }    
      
      
    //普通实现方法  
//  public static void main(String[] args) {  
//      Service s1 = new Saving();    
//      Service s2 = new Draw();    
//      Service s3 = new Fund();   
//        
//      //要办理业务的三个客户队列  
//      List<Service> list = new ArrayList<Service>();  
//      list.add(s1);  
//      list.add(s2);  
//      list.add(s3);  
//        
//      Iterator<Service> it = list.iterator();  
//      while(it.hasNext()){  
//        Service s = it.next();  
//         if (s instanceof Saving){    
//              System.out.println("存款");  
//  
//          }else if (s instanceof Draw){    
//              System.out.println("取款");  
//  
//          }else if (s instanceof Fund){    
//              System.out.println("基金");  
//          }     
//          
//      }  
//        
//     
//  
//  }  
      
}  


参考



分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP