it_worker365

   ::  ::  ::  ::  :: 管理

简易版本:分离与元素类本身关系不大且是易变的操作,使之符合单一职责原则

定义访问接口

package com.mandy.design1;

public interface ElementsFilter {
    boolean accept(String element);
}

定义主体类

package com.mandy.design1;

import java.util.ArrayList;

public class Elements {

    private ArrayList<String> elementList;

    public Elements(ArrayList<String> elementList) {
        this.elementList = elementList;
    }

    public void listElement(ElementsFilter elementsFilter) {
        for (String element : elementList) {
            boolean b = elementsFilter.accept(element);
            if (b) {
                System.out.println("list files: " + element);
            }
        }
    }

    public static void main(String[] args) {
        ArrayList<String> al = new ArrayList<String>();
        al.add("test");
        al.add("mandy");
        al.add("environment");
        Elements ele = new Elements(al);
        ele.listElement(
                new ElementsFilter() {
                    public boolean accept(String element) {
                        if (element.equals("test")) {
                            return false;
                        } else {
                            return true;
                        }
                    }
                });
    }
}

JDK中以及很多框架都有类似设计,我理解的好处是将处理逻辑由外部传入,减少耦合。

 

真正的访问者模式,抄自网络,重在理解。

abstract class Element {
    public abstract void accept(IVisitor visitor);
    public abstract void doSomething();
}

interface IVisitor {
    public void visit(ConcreteElement1 el1);
    public void visit(ConcreteElement2 el2);
}

class ConcreteElement1 extends Element {
    public void doSomething(){
        System.out.println("这是元素1");
    }
    
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
}

class ConcreteElement2 extends Element {
    public void doSomething(){
        System.out.println("这是元素2");
    }
    
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
}
class Visitor implements IVisitor {

    public void visit(ConcreteElement1 el1) {
        el1.doSomething();
    }
    
    public void visit(ConcreteElement2 el2) {
        el2.doSomething();
    }
}

class ObjectStruture {
    public static List<Element> getList(){
        List<Element> list = new ArrayList<Element>();
        Random ran = new Random();
        for(int i=0; i<10; i++){
            int a = ran.nextInt(100);
            if(a>50){
                list.add(new ConcreteElement1());
            }else{
                list.add(new ConcreteElement2());
            }
        }
        return list;
    }
}

public class Client {
    public static void main(String[] args){
        List<Element> list = ObjectStruture.getList();
        for(Element e: list){
            e.accept(new Visitor());
        }
    }
}

 

posted on 2015-11-11 17:06  it_worker365  阅读(142)  评论(0编辑  收藏  举报