设计模式(二十五)——访问者模式

一、以校长访问为例:

abstract class Person {
	private String name;
	public Person(String name) {
		super();
		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 String getCourse() {
		return course;
	}
	public void setCourse(String course) {
		this.course = course;
	}
	public int getAmount() {
		return amount;
	}
	public void setAmount(int amount) {
		this.amount = amount;
	}
	public Teacher(String name,String course,int amount) {
		super(name);
		// TODO Auto-generated constructor stub
		this.course = course;
		this.amount = 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 void setCourse(String course) {
		this.course = course;
	}
	public int getGrade() {
		return grade;
	}
	public void setGrade(int grade) {
		this.grade = grade;
	}
}
class PresidentVisitor {// 校长访问
	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 DeanVisitor {// 院长访问
	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());
		}
	}
}
public class Visitors {
	public static void main(String[] args) {
		List<Person> listperson = new ArrayList<Person>();
		Person t1 = new Teacher("张老师", "编译原理", 48);// 创建老师
		Person t2 = new Teacher("王老师", "数据库", 54);
		Student s1 = new Student("赵同学", "编译原理", 90);// 创建学生
		Student s2 = new Student("刘同学", "数据库", 82);
		listperson.add(t1);
		listperson.add(t2);
		listperson.add(s1);
		listperson.add(s2);
		PresidentVisitor pv = new PresidentVisitor();// 创建校长
		for (Person b : listperson) {
			pv.visit(b);
		}
		DeanVisitor dv = new DeanVisitor();// 创建院长
		for (Person b : listperson) {
			dv.visit(b);
		}
	}
}

改进:

//创建一个人员基类
abstract class Person {
	private String name;
	public Person(String name) {
		super();
		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 Visitor {
	void visit(Teacher teacher);
	void visit(Student student);
}
class PresidentVisitor implements Visitor {// 校长访问
	@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 DeanVisitor implements Visitor {// 院长访问
	@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());
	}
}
public class Visitors {
	public static void main(String[] args) {
		List<Person> listperson = new ArrayList<Person>();
		Person t1 = new Teacher("张老师", "编译原理", 48);// 创建老师
		Person t2 = new Teacher("王老师", "数据库", 54);
		Person s1 = new Student("赵同学", "编译原理", 90);// 创建学生
		Person s2 = new Student("刘同学", "数据库", 82);
		listperson.add(t1);
		listperson.add(t2);
		listperson.add(s1);
		listperson.add(s2);
		Visitor pv = new PresidentVisitor();// 创建校长
		for (Person b : listperson) {
			if (b instanceof Teacher) {
				Teacher teacher = (Teacher) b;
				pv.visit(teacher);
			} else if (b instanceof Student) {
				Student student = (Student) b;
				pv.visit(student);
			}
		}
		Visitor dv = new DeanVisitor();// 创建院长
		for (Person b : listperson) {
			if (b instanceof Teacher) {
				Teacher teacher = (Teacher) b;
				dv.visit(teacher);
			} else if (b instanceof Student) {
				Student student = (Student) b;
				dv.visit(student);
			}
		}
	}
}

继续改进:

//创建一个人员基类
abstract class Person {
	private String name;
	public Person(String name) {
		super();
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public abstract void accept(Visitor visitor);
}
// 教师
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(Visitor visitor) {
		// TODO Auto-generated method stub
		visitor.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(Visitor visitor) {
		// TODO Auto-generated method stub
		visitor.visit(this);
	}
}
interface Visitor {
	void visit(Teacher teacher);
	void visit(Student student);
}
class PresidentVisitor implements Visitor {// 校长访问
	@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 DeanVisitor implements Visitor {// 院长访问
	@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> lists = new ArrayList<Person>();
	public void Attach(Person element) {// 增加
		lists.add(element);
	}
	public void Detach(Person element) {// 移除
		lists.remove(element);
	}
	public void Display(Visitor visitor) {// 查看显示
		for (Person element : lists) {
			element.accept(visitor);
		}
	}
}
public class Visitors {
	public static void main(String[] args) {
		Person t1 = new Teacher("张老师", "编译原理", 48);// 创建老师
		Person t2 = new Teacher("王老师", "数据库", 54);
		Person s1 = new Student("赵同学", "编译原理", 90);// 创建学生
		Person s2 = new Student("刘同学", "数据库", 82);
		Visitor p = new PresidentVisitor();// 创建校长
		Visitor d = new DeanVisitor();// 院长
		ObjectList listperson = new ObjectList();
		listperson.Attach(t1);
		listperson.Attach(t2);
		listperson.Attach(s1);
		listperson.Attach(s2);
		listperson.Display(p);
		System.out.println("================");
		listperson.Display(d);
	}
}

二、访问者模式
访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

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

abstract class Visitor {
	public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);

	public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
}

class ConcreteVisitor1 extends Visitor {

	@Override
	public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
		// TODO Auto-generated method stub
		System.out.println(concreteElementA.getClass().getName() + "被" + this.getClass().getName() + "访问");
	}

	@Override
	public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
		// TODO Auto-generated method stub
		System.out.println(concreteElementB.getClass().getName() + "被" + this.getClass().getName() + "访问");
	}

}

class ConcreteVisitor2 extends Visitor {

	@Override
	public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
		// TODO Auto-generated method stub
		System.out.println(concreteElementA.getClass().getName() + "被" + this.getClass().getName() + "访问");
	}

	@Override
	public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
		// TODO Auto-generated method stub
		System.out.println(concreteElementB.getClass().getName() + "被" + this.getClass().getName() + "访问");
	}

}

abstract class Element {
	public abstract void Accept(Visitor visitor);
}

class ConcreteElementA extends Element {
	public void Accept(Visitor visitor) {
		visitor.VisitConcreteElementA(this);
	}

	public void OperationA() {
	}
}

class ConcreteElementB extends Element {
	public void Accept(Visitor visitor) {
		visitor.VisitConcreteElementB(this);
	}

	public void OperationB() {
	}
}

class ObjectStructure {
	private List<Element> elements = new ArrayList<Element>();

	public void Attach(Element element) {
		elements.add(element);
	}

	public void Detach(Element element) {
		elements.remove(element);
	}

	public void Accept(Visitor visitor) {
		for (Element e : elements) {
			e.Accept(visitor);
		}
	}
}

public class Visitors {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ObjectStructure o = new ObjectStructure();
		o.Attach(new ConcreteElementA());
		o.Attach(new ConcreteElementB());
		ConcreteVisitor1 v1 = new ConcreteVisitor1();
		ConcreteVisitor2 v2 = new ConcreteVisitor2();
		o.Accept(v1);
		o.Accept(v2);

	}

}

三、以男人和女人为例:

abstract class Person {
	protected String action;

	public String getAction() {
		return action;
	}

	public void setAction(String action) {
		this.action = action;
	}

	// 得到结论或反应
	public abstract void GetConclusion();
}

class Man extends Person {
	public void GetConclusion() {
		if (action == "成功") {
			System.out.println("男人" + action + "时,背后多半有一个伟大的女人。");
		} else if (action == "失败") {
			System.out.println("男人" + action + "时,闷头喝酒,谁也不用劝。");
		} else if (action == "恋爱") {
			System.out.println("男人" + action + "时,凡事不懂也要装懂。");
		}
	}
}

class Woman extends Person {
	public void GetConclusion() {
		if (action == "成功") {
			System.out.println("女人" + action + "时,背后多半有一个不成功的男人。");
		} else if (action == "失败") {
			System.out.println("女人" + action + "时,眼泪汪汪,谁也劝不了。");
		} else if (action == "恋爱") {
			System.out.println("女人" + action + "时,遇事懂也装作不懂。");
		}
	}
}

public class Visitors {
	public static void main(String[] args) {

		List<Person> persons = new ArrayList<Person>();

		Person man1 = new Man();
		man1.setAction("成功");
		persons.add(man1);
		Person woman1 = new Woman();
		woman1.setAction("成功");
		persons.add(woman1);

		Person man2 = new Man();
		man2.setAction("失败");
		persons.add(man2);
		Person woman2 = new Woman();
		woman2.setAction("失败");
		persons.add(woman2);

		Person man3 = new Man();
		man3.setAction("恋爱");
		persons.add(man3);
		Person woman3 = new Woman();
		woman3.setAction("恋爱");
		persons.add(woman3);

		for (Person item : persons) {
			item.GetConclusion();
		}

	}
}

改进:

abstract class Action {

	// 得到男人结论或反应
	public abstract void GetManConclusion(Man concreteElementA);

	// 得到女人结论或反应
	public abstract void GetWomanConclusion(Woman concreteElementB);
}

class Success extends Action {

	@Override
	public void GetManConclusion(Man concreteElementA) {
		// TODO Auto-generated method stub
		System.out.println("男人成功时,背后多半有一个伟大的女人。");

	}

	@Override
	public void GetWomanConclusion(Woman concreteElementB) {
		// TODO Auto-generated method stub
		System.out.println("女人成功时,背后多半有一个不成功的男人。");
	}
}

class Falling extends Action {

	@Override
	public void GetManConclusion(Man concreteElementA) {
		// TODO Auto-generated method stub
		System.out.println("男人失败时,闷头喝酒,谁也不用劝。");
	}

	@Override
	public void GetWomanConclusion(Woman concreteElementB) {
		// TODO Auto-generated method stub
		System.out.println("女人失败时,眼泪汪汪,谁也劝不了。");
	}
}

class Amativeness extends Action {

	@Override
	public void GetManConclusion(Man concreteElementA) {
		// TODO Auto-generated method stub
		System.out.println("男人恋爱时,凡事不懂也要装懂。");
	}

	@Override
	public void GetWomanConclusion(Woman concreteElementB) {
		// TODO Auto-generated method stub
		System.out.println("女人恋爱时,遇事懂也装作不懂。");
	}

}

abstract class Person {
	public void Accept(Action visitor) {

	}
}

class Man extends Person {
	public void Accept(Action visitor) {
		visitor.GetManConclusion(this);
	}
}

class Woman extends Person {
	public void Accept(Action visitor) {
		visitor.GetWomanConclusion(this);
	}
}

class ObjectStructure {
	private List<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 e : elements) {
			e.Accept(visitor);
		}
	}
}

public class Visitors {
	public static void main(String[] args) {

		ObjectStructure o = new ObjectStructure();
		o.Attach(new Man());
		o.Attach(new Woman());

		// 成功时的反应
		Success v1 = new Success();
		o.Display(v1);

		// 失败时的反应
		Falling v2 = new Falling();
		o.Display(v2);

		// 恋爱时的反应
		Amativeness v3 = new Amativeness();
		o.Display(v3);

	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装饰者模式是一种结构型设计模式,它允许你动态地向对象添加行为。通过将对象放入装饰器类中,可以在运行时更改对象的行为。 在咖啡馆中,装饰者模式可以用于根据顾客的选择动态地添加配料并计算价格。我们可以创建一个基础咖啡类,然后创建多个装饰器类来添加不同的配料,并且每个装饰器类都可以计算自己的价格。 下面是一个简单的示例代码: ```java // 基础咖啡类 public abstract class Coffee { protected String description = "Unknown coffee"; public String getDescription() { return description; } public abstract double cost(); } // 浓缩咖啡类 public class Espresso extends Coffee { public Espresso() { description = "Espresso"; } public double cost() { return 1.99; } } // 装饰器类,用于添加牛奶 public class Milk extends Coffee { private Coffee coffee; public Milk(Coffee coffee) { this.coffee = coffee; } public String getDescription() { return coffee.getDescription() + ", Milk"; } public double cost() { return coffee.cost() + 0.5; } } // 装饰器类,用于添加摩卡 public class Mocha extends Coffee { private Coffee coffee; public Mocha(Coffee coffee) { this.coffee = coffee; } public String getDescription() { return coffee.getDescription() + ", Mocha"; } public double cost() { return coffee.cost() + 0.8; } } // 测试代码 public static void main(String[] args) { Coffee coffee = new Espresso(); // 创建一个浓缩咖啡 coffee = new Milk(coffee); // 添加牛奶 coffee = new Mocha(coffee); // 添加摩卡 System.out.println(coffee.getDescription() + " $" + coffee.cost()); } ``` 输出结果为:`Espresso, Milk, Mocha $3.29` 在这个例子中,我们创建了一个基础咖啡类 `Coffee`,并且创建了两个装饰器类 `Milk` 和 `Mocha`。我们可以通过创建不同的装饰器来添加不同的配料。最后,我们创建了一个浓缩咖啡对象 `Espresso`,并且动态地添加了牛奶和摩卡,最终计算出了价格。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值