23种设计模式第十六篇:java访问者模式
定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
类型:行为类模式
类图:
A类{ 公共空间method1 () { System.out.println(“我是”); } 公共空间method2 (B B) { b.showA(这个); } } B类{ 公共空间昭和(一){ a.method1 (); } } >之前
我们主要来看一下在类中,方法method1和方法method2的区别在哪里,方法method1很简单,就是打印出一句”我是一个“;方法method2稍微复杂一点,使用类B作为参数,并调用B类的昭和方法。
再来看一下类B的昭和方法,昭和方法使用类一个作为参数,然后调用类一个的method1方法,可以看的到,method2方法绕来绕去,无非就是调用了一下自己的method1方法而已,它的运行结果应该也是“我是”,分析完之后,我们来运行一下这两个方法,并看一下运行结果:
公共类测试{ 公共静态void main (String [] args) { 一个=new (); a.method1 (); 一个。method2(新的B ()); } } >之前运行结果为:
,,,,,,看懂了这个例子,就理解了访问者模式的90%,在例子中,对于类一个来说,B类就是一个访问者。但是这个例子并不是访问者模式的全部,虽然直观,但是它的可扩展性比较差,下面我们就来说一下访问者模式的通用实现,通过类图可以看的到,在访问者模式中,主要包括下面几个角色:
<>强抽象访问者:>强抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是访问方法中的参数定义哪些对象是可以被访问的。
<强>访问者:>强实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。
<>强抽象元素类:强>接口或者抽象类,声明接受哪一类访问者访问,程序上是通过接受方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。
<强>元素类:>强实现抽象元素类所声明的接受方法,通常都是visitor.visit(这),基本上已经形成一种定式了。
<强>结构对象:强>一个元素的容器,一般包含一个容纳多个不同类,不同接口的容器,如列表,设置,地图等,在项目中一般很少抽象出这个角色。访问者模式的通用代码实现
抽象类元素{ 公共抽象空洞接受(IVisitor游客); 公共抽象空洞doSomething (); } 接口IVisitor { 公共空间访问(ConcreteElement1 el1); 公共空间访问(ConcreteElement2 el2); } 类ConcreteElement1扩展元素{ 公共空间doSomething () { System.out.println(“这是元素1 "); } 公共空间接受(IVisitor访问者){ visitor.visit(这个); } } 类ConcreteElement2扩展元素{ 公共空间doSomething () { System.out.println(“这是元素2”); } 公共空间接受(IVisitor访问者){ visitor.visit(这个); } } 类访问者实现IVisitor { 公共空间访问(ConcreteElement1 el1) { el1.doSomething (); } 公共空间访问(ConcreteElement2 el2) { el2.doSomething (); } } 类ObjectStruture { 公共静态ListgetList () { List 列表=new ArrayList (); 随机跑=new随机(); for (int i=0;i<10;我+ +){ int=ran.nextInt (100); 如果(a> 50) { 列表。添加(新ConcreteElement1 ()); 其他}{ 列表。添加(新ConcreteElement2 ()); } } 返回列表; } } 公共类客户{ 公共静态void main (String [] args) { List =ObjectStruture.getList列表(); (元素e:列表){ e。接受(新访客()); } } } >之前
23种设计模式(16)java访问者模式