Java设计模式(21)行为型:访问者模式:(一)模式概念:访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定算法又易变化的系统,若系统数据结构对象易于变化,则不适合使用访问者模式。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。
1)Visitor 抽象访问者角色:
为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定接口直接访问它。
2)ConcreteVisitor具体访问者角色:
实现Visitor声明的接口。
3)Element抽象受访元素:
定义一个接受访问操作(accept()),它以一个访问者(Visitor)作为参数。
4)ConcreteElement 具体受访元素:
实现了抽象元素(Element)所定义的接受操作接口。
5)ObjectStructure 结构对象角色:
这是使用访问者模式必备的角色。它具备以下特性:能枚举它的元素;可以提供一个高层接口以允许访问者访问它的元素;如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。
抽象访问者角色:
public interface IVisitor { public void accept(Feman feman); public void accept(Man man); }具体访问角色:
public class Visitor implements IVisitor { public void accept(Feman feman) { System.out.println(feman.getSex() + ":执行相关操作"); } public void accept(Man man) { System.out.println(man.getSex() + ":执行相关操作"); } }(注)Visitor中设置了同样的名称的方法且方法传参为实现同一接口的不同对象,即受访者元素。
public abstract class Person { private String sex; public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public void accept(Visitor visitor) { }; }具体受访元素:
public class Man extends Person { public Man() { this.setSex("男"); } @Override public void accept(Visitor visitor) { visitor.accept(this); } }
public class Feman extends Person { public Feman() { this.setSex("女"); } @Override public void accept(Visitor visitor){ visitor.accept(this); } }结构对象角色:
public class ObjectStruture { public static List执行过程:getList() { List list = new ArrayList (); list.add(new Man()); list.add(new Feman()); list.add(new Feman()); return list; } }
Visitor visitor = new Visitor(); List执行结果:list = ObjectStruture.getList(); for (Person e : list) { e.accept(visitor); }
男:执行相关操作 女:执行相关操作 女:执行相关操作