设计模式之访问者模式
来源:互联网 发布:无线暴力破解软件 编辑:程序博客网 时间:2024/06/07 02:55
访问者模式的结构
基本代码
import java.util.ArrayList;import java.util.List;public abstract class Visitor{ public abstract void visitConcreteElementA(ConcreteElementA concreteElementA); public abstract void visitConcreteElementB(ConcreteElementB concreteElementB);}public abstract class Element{ public abstract void Accept(Visitor visitor);}public class ConcreteElementA extends Element{ @Override public void Accept(Visitor visitor) { // TODO Auto-generated method stub visitor.visitConcreteElementA(this); }}public class ConcreteElementB extends Element{ @Override public void Accept(Visitor visitor) { // TODO Auto-generated method stub visitor.visitConcreteElementB(this); }}public class ConcreteVisitor1 extends Visitor{ @Override public void visitConcreteElementA(ConcreteElementA concreteElementA) { // TODO Auto-generated method stub System.out.println(this.getClass()+" visit "+concreteElementA.getClass()); } @Override public void visitConcreteElementB(ConcreteElementB concreteElementB) { // TODO Auto-generated method stub System.out.println(this.getClass()+" visit "+concreteElementB.getClass()); }}public class ConcreteVisitor2 extends Visitor{ @Override public void visitConcreteElementA(ConcreteElementA concreteElementA) { // TODO Auto-generated method stub System.out.println(this.getClass()+" visit "+concreteElementA.getClass()); } @Override public void visitConcreteElementB(ConcreteElementB concreteElementB) { // TODO Auto-generated method stub System.out.println(this.getClass()+" visit "+concreteElementB.getClass()); }}public class ObjectStructure{ private List<Element> lists = new ArrayList<Element>(); public void addElement(Element element) { lists.add(element); } public void deleteElement(Element element) { lists.remove(element); } public void Accept(Visitor visitor) { for (Element element : lists) { element.Accept(visitor); } }}class Client{ public static void main() { ObjectStructure objectStructure = new ObjectStructure(); objectStructure.addElement(new ConcreteElementA()); objectStructure.addElement(new ConcreteElementB()); ConcreteVisitor1 concreteVisitor1 = new ConcreteVisitor1(); ConcreteVisitor2 concreteVisitor2 = new ConcreteVisitor2(); objectStructure.Accept(concreteVisitor1); objectStructure.Accept(concreteVisitor2); }}
举个例子
比如 有男人和女人的例子:
状态(成功,失败,恋爱)
人(男人,女人)
对象 结构ObjectStuctur
客户端Client
/** * "状态"抽象类 */public abstract class Action { //得到男人结论或反应 public abstract void GetManConclusion(man concretElementA); //得到女人结论或反应 public abstract void GetWomanConclusion(woman concretElementB);}/** * 成功状态的具体类 */public class Success extends Action{ @Override public void GetManConclusion(man concretElementA) { System.out.println("man 成功时,背后多半有一个伟大的女人"); } @Override public void GetWomanConclusion(woman concretElementB) { System.out.println("woman 成功时,背后大有一个不成功的男人"); }}/** * 失败状态的具体类 */public class Failing extends Action{ @Override public void GetManConclusion(man concretElementA) { System.out.println("man失败时,闷头喝酒, 谁也不用劝"); } @Override public void GetWomanConclusion(woman concretElementB) { System.out.println("woman失败时,眼泪汪汪,谁也劝不了"); }}/** * 恋爱状态具体类 */public class Amativeness extends Action{ @Override public void GetManConclusion(man concretElementA) { System.out.println("man恋爱时,凡是不懂也要装懂"); } @Override public void GetWomanConclusion(woman concretElementB) { System.out.println("woman恋爱时,遇事懂也装作不懂"); }}/** * “人” 抽象类 ,是“男人”和“女人”的抽象类 */public abstract class Person { //接受状态对象 public abstract void Accept(Action visitor);}/** * "男人"类 */public class man extends Person { @Override public void Accept(Action visitor) { visitor.GetManConclusion(this); }}/** * "女人"类 */public class woman extends Person{ @Override public void Accept(Action visitor) { visitor.GetWomanConclusion(this); }}/** * 对象结构 */public class ObjectStucture { private ArrayList<Person> elements = new ArrayList<Person>(); //增加 public void Attach(Person element) { elements.add(element); } //移除 public void Detach(Person element) { elements.remove(element); } //查看显示 public void display(Action visitor) { for (Person element : elements) { element.Accept(visitor); } }}/** * 客户端代码 */public class Client { public static void main(String[] args) { ObjectStucture o = new ObjectStucture(); o.Attach(new man()); o.Attach(new woman()); //成功时反应 Success success = new Success(); o.display(success); //失败时的反应 Failing failing = new Failing(); o.display(failing); //恋爱时的反应 Amativeness amativeness = new Amativeness(); o.display(amativeness); }}
访问者模式的优点,缺点,目的
访问者模式的目的是把处理从数结构中分离出来;
优点 适用于稳定的系统;
但是缺点就是增加新的数据结构比较困难。
访问者模式的能力和复杂性是把双刃剑,只有当真正需要它的时候,才考虑使用它。
0 0
- 设计模式之访问者
- 设计模式之访问者
- 设计模式之访问者模式
- 设计模式之--访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 【设计模式】之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- 设计模式之访问者模式
- C语言学习历程——Training04字符串训练01
- C语言知识小结
- c++中一些头文件的用法
- struts2 Action 跟 Actionsupport 的区别
- PBR基础知识干货总结(1)
- 设计模式之访问者模式
- 搜索练习6/poj.org/problem3278 /Catch That Cow/简单的bfs模板
- 4-4 链式表的按序号查找 (10分) PTA
- ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock
- mysql索引
- c语言知识总结
- C语言学习历程——Training04字符串训练02
- 【MOOC】Python数据分析与展示-北京理工大学-【第一周】数据分析之表示
- mysql集群(主从复制)