访问者模式
2015-08-05 23:57
218 查看
应用场景:
访问者模式结构:
访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口.
具体访问者角色(Concrete Visitor): 实现每个由访问者角色(Visitor)声明的操作.
元素角色(Element): 定义一个Accept操作,它以一个访问者为参数.
具体元素角色(Concrete Element): 实现由元素角色提供的Accept操作.
对象结构角色(Object Structure): 这是使用访问者模式必备的角色. 它要具备以下特征: 能枚举它的元素; 可以提供一个高层的接口以允许该访问者访问它的元素; 可以是一个复合(组合模式)或是一个集合, 如一个列表或一个无序集合.
/**
* 访问的接口
* @author Administrator
*
*/
public interface IVisitor {
void visit(Wheel wheel);
void visit(Engine engine);
void visit(Body body);
void visit(Car car);
}
-------------------------------------------------------------
/**
* 具体的访问者
* @author Administrator
*
*/
public class PrintVisitor implements IVisitor {
@Override
public void visit(Wheel wheel) {
System.out.println("Visiting " + wheel.getName() + " wheel");
}
@Override
public void visit(Engine engine) {
System.out.println("Visiting engine");
}
@Override
public void visit(Body body) {
System.out.println("Visiting body");
}
@Override
public void visit(Car car) {
System.out.println("Visiting car");
}
}
------------------------------------------------------------------------------------------------
/**
* 被访问的对象Body
* @author Administrator
*
*/
public class Body {
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
--------------------------------------------------------------------
/**
* 被访问的对象Engine
* @author Administrator
*
*/
public class Engine {
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
--------------------------------------------------------------------------------
/**
* 被访问的对象Wheel
* @author Administrator
*
*/
public class Wheel {
private String name;
public Wheel(String name) {
this.name = name;
}
String getName() {
return this.name;
}
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
-------------------------------------------------------------------------------------------
/**
* 被访问的对象Car
* @author Administrator
*
*/
public class Car {
private Engine engine = new Engine();
private Body body = new Body();
private Wheel[] wheels
= { new Wheel("front left"), new Wheel("front right"),
new Wheel("back left") , new Wheel("back right") };
public void accept(IVisitor visitor) {
visitor.visit(this);
engine.accept(visitor);
body.accept(visitor) ;
for (int i = 0; i < wheels.length; ++ i)
wheels[i].accept(visitor);
}
}
------------------------------------------------------------------------------------------------
public class Test {
/**
* 测试类 访问小汽车
*/
public static void main(String[] args) {
Car car = new Car();
IVisitor visitor = new PrintVisitor();
car.accept(visitor);
}
}
访问者模式结构:
访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口.
具体访问者角色(Concrete Visitor): 实现每个由访问者角色(Visitor)声明的操作.
元素角色(Element): 定义一个Accept操作,它以一个访问者为参数.
具体元素角色(Concrete Element): 实现由元素角色提供的Accept操作.
对象结构角色(Object Structure): 这是使用访问者模式必备的角色. 它要具备以下特征: 能枚举它的元素; 可以提供一个高层的接口以允许该访问者访问它的元素; 可以是一个复合(组合模式)或是一个集合, 如一个列表或一个无序集合.
/**
* 访问的接口
* @author Administrator
*
*/
public interface IVisitor {
void visit(Wheel wheel);
void visit(Engine engine);
void visit(Body body);
void visit(Car car);
}
-------------------------------------------------------------
/**
* 具体的访问者
* @author Administrator
*
*/
public class PrintVisitor implements IVisitor {
@Override
public void visit(Wheel wheel) {
System.out.println("Visiting " + wheel.getName() + " wheel");
}
@Override
public void visit(Engine engine) {
System.out.println("Visiting engine");
}
@Override
public void visit(Body body) {
System.out.println("Visiting body");
}
@Override
public void visit(Car car) {
System.out.println("Visiting car");
}
}
------------------------------------------------------------------------------------------------
/**
* 被访问的对象Body
* @author Administrator
*
*/
public class Body {
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
--------------------------------------------------------------------
/**
* 被访问的对象Engine
* @author Administrator
*
*/
public class Engine {
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
--------------------------------------------------------------------------------
/**
* 被访问的对象Wheel
* @author Administrator
*
*/
public class Wheel {
private String name;
public Wheel(String name) {
this.name = name;
}
String getName() {
return this.name;
}
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
-------------------------------------------------------------------------------------------
/**
* 被访问的对象Car
* @author Administrator
*
*/
public class Car {
private Engine engine = new Engine();
private Body body = new Body();
private Wheel[] wheels
= { new Wheel("front left"), new Wheel("front right"),
new Wheel("back left") , new Wheel("back right") };
public void accept(IVisitor visitor) {
visitor.visit(this);
engine.accept(visitor);
body.accept(visitor) ;
for (int i = 0; i < wheels.length; ++ i)
wheels[i].accept(visitor);
}
}
------------------------------------------------------------------------------------------------
public class Test {
/**
* 测试类 访问小汽车
*/
public static void main(String[] args) {
Car car = new Car();
IVisitor visitor = new PrintVisitor();
car.accept(visitor);
}
}
相关文章推荐
- NYOJ 811 变态最大值
- 基于EasyDarwin实现幼儿园监控类项目
- If-Memcached集成手册
- Java虚拟机结构及常见内存溢出异常
- 基于EasyDarwin实现幼儿园监控类项目
- 截图工具
- iOS开发--设置UIButton
- Binary Tree Zigzag Level Order Traversal
- zoj 2100 Seeding
- Codeforces Round #250 (Div. 1) B. The Child and Zoo(排序+并查集)(常规好题)
- 获取所有连接到手机wifi热点的手机IP地址 和MAC地址。
- Android 自定义ImageView实现src属性的选择器效果
- jquery insert a table into div
- 单片机上电延时1s
- 2、快速排序(QuickSort)-C#实现
- OgnlContext、OgnlValueStack、CompoundRoot的数据结构
- 【转】Akka 快速入门
- [python]学习笔记4-关于列表去重练习
- JUC系列三:对象的委托与组合
- if-mdp使用手册