设计模式----访问者模式(JAVA)

模式简析

/**
 * 
 */
/**
 * 访问者模式
 * 动机:将数据结构与数据操作分离。
 * 解决的问题:稳定的数据结构和易变的操作耦合问题。
 * 优点: 
 * 1、符合单一职责原则。 
 * 2、优秀的扩展性。 
 * 3、灵活性。
 * 缺点: 
 * 1、具体元素对访问者公布细节,违反了迪米特原则。 
 * 2、具体元素变更比较困难。 
 * 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。
 * 使用场景: 
 * 1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 
 * 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作影响这些对象的类,也不希望在增加新操作时修改这些类。
 *
 */

具体实例

import java.util.ArrayList;
import java.util.List;

/*
 * 实例
 * 校长和院长对老师学生的检查
 * 校长关注老师的工作和学生的课程
 * 院长关注老师的课程和学生的成绩
 * 
 * 简单的面向对象的方法实现
 */
public class Demo1 {
	public static void main(String[] args) {
		List<Person> list = new ArrayList<Person>();
		Person p1 = new Teacher("王老师","设计模式",48);
		Person p2 = new Teacher("李老师","数据库",48);
		Person p3 = new Student("张同学","设计模式",100);
		Person p4 = new Student("王同学","数据库",100);
		list.add(p4);
		list.add(p3);
		list.add(p2);
		list.add(p1);
		PresidentVisiter p =new PresidentVisiter();
		for(Person person :list) {
			p.Visit(person);
		}
		YuanZHangVisiter y = new YuanZHangVisiter();
		for(Person person:list) {
			y.Visit(person);
		}
	}
}
class Person{
	private String name;
	public Person(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
class Teacher extends Person{
	private String Course;
	private int Amount;
	public Teacher(String name,String Course,int Amount) {
		super(name);
		this.Course = Course;
		this.Amount = Amount;
	}
	public String getCourse() {
		return Course;
	}
	public int getAmount() {
		return Amount;
	}
	
}
class Student extends Person{
	private String Course;
	private int grade;
	public Student(String name,String Course,int grade) {
		super(name);
		this.Course = Course;
		this.grade = grade;
	}
	public String getCourse() {
		return Course;
	}
	public int getGrade() {
		return grade;
	}
	
}
class PresidentVisiter{
	public void Visit(Person person) {
		if(person instanceof Teacher) {
			Teacher teacher = (Teacher)person;
			System.out.println("校长访问老师:"+teacher.getName()+"学时:"+teacher.getAmount());
		}else if(person instanceof Student) {
			Student student = (Student)person;
			System.out.println("校长访问学生:"+student.getName()+"课程:"+student.getCourse());
		}
	}
}
class YuanZHangVisiter{
	public void Visit(Person person) {
		if(person instanceof Teacher) {
			Teacher teacher = (Teacher)person;
			System.out.println("院长访问老师:"+teacher.getName()+"课程:"+teacher.getCourse());
		}else if(person instanceof Student) {
			Student student = (Student)person;
			System.out.println("院长访问学生:"+student.getName()+"成绩:"+student.getGrade());
		}
	}
}
import java.util.ArrayList;
import java.util.List;

/*
 * 实例
 * 校长和院长对老师学生的检查
 * 校长关注老师的工作和学生的课程
 * 院长关注老师的课程和学生的成绩
 * 
 * 简单的面向对象的方法实现
 * 
 * 重构代码
 */
public class Demo1 {
	public static void main(String[] args) {
		List<Person> list = new ArrayList<Person>();
		Person p1 = new Teacher("王老师","设计模式",48);
		Person p2 = new Teacher("李老师","数据库",48);
		Person p3 = new Student("张同学","设计模式",100);
		Person p4 = new Student("王同学","数据库",100);
		list.add(p4);
		list.add(p3);
		list.add(p2);
		list.add(p1);
		PresidentVisiter p =new PresidentVisiter();
		for(Person person :list) {
			if(person instanceof Teacher) {
				Teacher t =(Teacher)person;
				p.Visit(t);
			}else if(person instanceof Student) {
				Student s =(Student)person;
				p.Visit(s);
			}
		}
		YuanZHangVisiter y = new YuanZHangVisiter();
		for(Person person:list) {
			if(person instanceof Teacher) {
				Teacher t =(Teacher)person;
				y.Visit(t);
			}else if(person instanceof Student) {
				Student s =(Student)person;
				y.Visit(s);
			}
		}
	}
}
class Person{
	private String name;
	public Person(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
}
class Teacher extends Person{
	private String Course;
	private int Amount;
	public Teacher(String name,String Course,int Amount) {
		super(name);
		this.Course = Course;
		this.Amount = Amount;
	}
	public String getCourse() {
		return Course;
	}
	public int getAmount() {
		return Amount;
	}
	
}
class Student extends Person{
	private String Course;
	private int grade;
	public Student(String name,String Course,int grade) {
		super(name);
		this.Course = Course;
		this.grade = grade;
	}
	public String getCourse() {
		return Course;
	}
	public int getGrade() {
		return grade;
	}
	
}
interface Visiter{
	void Visit(Teacher teacher);
	void Visit(Student student);
}
class PresidentVisiter implements Visiter{

	@Override
	public void Visit(Teacher teacher) {
		// TODO Auto-generated method stub
		System.out.println("校长访问老师:"+teacher.getName()+"学时:"+teacher.getAmount());
	}

	@Override
	public void Visit(Student student) {
		// TODO Auto-generated method stub
		System.out.println("校长访问学生:"+student.getName()+"课程:"+student.getCourse());
	}
	
	
}
class YuanZHangVisiter implements Visiter{
	@Override
	public void Visit(Teacher teacher) {
		// TODO Auto-generated method stub
		System.out.println("院长访问老师:"+teacher.getName()+"课程:"+teacher.getCourse());
	}

	@Override
	public void Visit(Student student) {
		// TODO Auto-generated method stub
		System.out.println("院长访问学生:"+student.getName()+"成绩:"+student.getGrade());
	}
}
import java.util.ArrayList;
import java.util.List;

/*
 * 实例
 * 校长和院长对老师学生的检查
 * 校长关注老师的工作和学生的课程
 * 院长关注老师的课程和学生的成绩
 * 
 * 访问者模式实现
 * 
 * 
 */
public class Demo1 {
	public static void main(String[] args) {
		Person p1 = new Teacher("王老师","设计模式",48);
		Person p2 = new Teacher("李老师","数据库",48);
		Person p3 = new Student("张同学","设计模式",100);
		Person p4 = new Student("王同学","数据库",100);
		PresidentVisiter p =new PresidentVisiter();
		YuanZHangVisiter y = new YuanZHangVisiter();
		ObjectList ol = new ObjectList();
		ol.Attach(p4);
		ol.Attach(p3);
		ol.Attach(p2);
		ol.Attach(p1);
		ol.Display(p);
		System.out.println("============================================");
		ol.Display(y);
	}
}
abstract class Person{
	private String name;
	public Person(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public abstract void accept(Visiter visiter);
}
class Teacher extends Person{
	private String Course;
	private int Amount;
	public Teacher(String name,String Course,int Amount) {
		super(name);
		this.Course = Course;
		this.Amount = Amount;
	}
	public String getCourse() {
		return Course;
	}
	public int getAmount() {
		return Amount;
	}
	@Override
	public void accept(Visiter visiter) {
		// TODO Auto-generated method stub
		visiter.Visit(this);
	}
	
}
class Student extends Person{
	private String Course;
	private int grade;
	public Student(String name,String Course,int grade) {
		super(name);
		this.Course = Course;
		this.grade = grade;
	}
	public String getCourse() {
		return Course;
	}
	public int getGrade() {
		return grade;
	}
	@Override
	public void accept(Visiter visiter) {
		// TODO Auto-generated method stub
		visiter.Visit(this);
	}
	
}
interface Visiter{
	void Visit(Teacher teacher);
	void Visit(Student student);
}
class PresidentVisiter implements Visiter{

	@Override
	public void Visit(Teacher teacher) {
		// TODO Auto-generated method stub
		System.out.println("校长访问老师:"+teacher.getName()+"学时:"+teacher.getAmount());
	}

	@Override
	public void Visit(Student student) {
		// TODO Auto-generated method stub
		System.out.println("校长访问学生:"+student.getName()+"课程:"+student.getCourse());
	}
	
	
}
class YuanZHangVisiter implements Visiter{
	@Override
	public void Visit(Teacher teacher) {
		// TODO Auto-generated method stub
		System.out.println("院长访问老师:"+teacher.getName()+"课程:"+teacher.getCourse());
	}

	@Override
	public void Visit(Student student) {
		// TODO Auto-generated method stub
		System.out.println("院长访问学生:"+student.getName()+"成绩:"+student.getGrade());
	}
}
class ObjectList{
	private List<Person> list = new ArrayList<Person>();
	public void Attach(Person person) {
		list.add(person);
	}
	public void Detach(Person person) {
		list.remove(person);
	}
	public void Display(Visiter visiter) {
		for(Person p:list) {
			p.accept(visiter);
		}
	}
}
import java.util.ArrayList;
import java.util.List;

/*
 * 访问者模式基本代码
 */
public class Demo2 {
	public static void main(String[] args) {
		ObjecStructure o =new ObjecStructure();
		o.Attach(new ConcreteA());
		o.Attach(new ConcreteB());
		Visitor1 v1 = new Visitor1();
		Visitor2 v2 = new Visitor2();
		o.Accept(v1);
		System.out.println("=====================================");
		o.Accept(v2);
	}
}
interface Visitor{
	void VisitConcreteA(ConcreteA A);
	void VisitConcreteB(ConcreteB B);
}
class Visitor1 implements Visitor{

	@Override
	public void VisitConcreteA(ConcreteA A) {
		// TODO Auto-generated method stub
		System.out.println(A.getClass().toString()+"被"+this.getClass().toString()+"访问");
	}

	@Override
	public void VisitConcreteB(ConcreteB B) {
		// TODO Auto-generated method stub
		System.out.println(B.getClass().toString()+"被"+this.getClass().toString()+"访问");
	}
	
}
class Visitor2 implements Visitor{

	@Override
	public void VisitConcreteA(ConcreteA A) {
		// TODO Auto-generated method stub
		System.out.println(A.getClass().toString()+"被"+this.getClass().toString()+"访问");
	}

	@Override
	public void VisitConcreteB(ConcreteB B) {
		// TODO Auto-generated method stub
		System.out.println(B.getClass().toString()+"被"+this.getClass().toString()+"访问");
	}
}
abstract class Element{
	public abstract void Accept(Visitor visitor);
}
class ConcreteA extends Element{

	@Override
	public void Accept(Visitor visitor) {
		// TODO Auto-generated method stub
		visitor.VisitConcreteA(this);
	}
	public void OperatorA() {
		
	}
	
}
class ConcreteB extends Element{

	@Override
	public void Accept(Visitor visitor) {
		// TODO Auto-generated method stub
		visitor.VisitConcreteB(this);
	}
	public void OperatorB() {
		
	}
	
}
class ObjecStructure{
	private List<Element> list = new ArrayList<Element>();
	public void Attach(Element element) {
		list.add(element);
	}
	public void Detach(Element element) {
		list.remove(element);
	}
	public void Accept(Visitor visitor) {
		for(Element p:list) {
			p.Accept(visitor);
		}
	}
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值