设计模式之访问者模式
设计模式 Java About 2,149 words作用
需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联),同时需要避免让这些操作"污染"这些对象的类。
可以对功能进行统一,可以做报表、UI、拦截器与过滤器,适用于数据结构相对稳定的系统。
原理

Visitor:抽象访问者,为该对象结构中的ConcreteElement的每一个类声明一个visit操作。
ConcreteVisitor:具体的访问者,实现每个有Visitor声明的操作,是每个操作实现的部分。
ObjectStructure:枚举它的元素,可以提供一个高层的接口,用来允许访问者访问元素。
Element:定义一个accept方法,接收一个访问者对象。
ConcreteElement:具体元素,实现了accept方法。
案例
Vistor抽象访问者
public abstract class Action {
    public abstract void getManResult(Man man);
    public abstract void getWomanResult(Woman woman);
}ConcreteVisitor具体访问者
public class Success extends Action {
    @Override
    public void getManResult(Man man) {
        System.out.println(" 男人给的评价该歌手很成功 !");
    }
    @Override
    public void getWomanResult(Woman woman) {
        System.out.println(" 女人给的评价该歌手很成功 !");
    }
}
public class Fail extends Action {
    @Override
    public void getManResult(Man man) {
        System.out.println(" 男人给的评价该歌手失败 !");
    }
    @Override
    public void getWomanResult(Woman woman) {
        System.out.println(" 女人给的评价该歌手失败 !");
    }
}Element
public interface Person {
    void accept(Action action);
}ConcreteElement具体元素
public class Man implements Person {
    @Override
    public void accept(Action action) {
        action.getManResult(this);
    }
}
public class Woman implements Person {
    @Override
    public void accept(Action action) {
        action.getWomanResult(this);
    }
}ObjectStructure展示元素
public class ObjectStructure {
    private List<Person> people = new ArrayList<>();
    public void attach(Person person) {
        people.add(person);
    }
    public void detach(Person person) {
        people.remove(person);
    }
    public void display(Action action) {
        for (Person person : people) {
            person.accept(action);
        }
    }
}调用
public class Client {
    public static void main(String[] args) {
        ObjectStructure os = new ObjectStructure();
        os.attach(new Man());
        os.attach(new Woman());
        Success success = new Success();
        os.display(success);
        System.out.println("-------");
        Fail fail = new Fail();
        os.display(fail);
    }
}
                Views: 3,780 · Posted: 2019-12-26
            
            ————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓
 
        Loading...