设计模式之访问者模式

访问者模式允许在对象结构中添加新操作,而不改变元素类。它包含抽象访问者、具体访问者、抽象元素、具体元素和对象结构等角色。模式优点是扩展性好,但增加新元素类较困难。常用于处理不同类型的对象并执行相关操作的场景。案例展示了如何使用访问者模式进行不同人群的评价处理。
摘要由CSDN通过智能技术生成

什么是访问者模式

    访问者模式提供了一个作用于某对象结构中的各元素的操作表示,他使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
    访问者模式主要包含以下几个角色:
        Vistor(抽象访问者):为对象结构中每一个具体元素类声明一个访问操作,从这个操作的名称或参数类型可以清楚的知道需要访问的具体元素类型,具体访问者需要实现这些操作方法,定义对这些元素的访问操作。
        ConcreteVistor(具体访问者):实现了每一个由抽象访问者声明的操作,每一个操作用于访问对象结构中一种类型的元素。
        Element(抽象元素):一般是抽象类或接口,定义了一个由抽象访问者作为参数的方法。
        ConcreteElement(具体元素):实现了抽象元素中的方法,在该方法中调用访问者的访问方法以完成一个元素的操作。
        ObjectStructure(对象结构):是一个元素的集合,用于存放元素对象,并且提供了遍历集合的方法。

访问者模式的优缺点

优点
  1. 增加新的访问者很方便,无需修改源代码,符合开闭原则。
  2. 将有关元素对象的访问行为集中到一个访问者中,有利于对象结构中元素对象的复用。
  3. 可以在不修改现有元素层次结构的前提下,定义作用于该层次结构的操作。
缺点
  1. 增加新的元素类很困难,每增加一个元素类都要在抽象访问者角色中增加一个新的抽象操作,并在具体访问者类中增加相应的具体操作,违背了开闭原则。
  2. 破坏了封装,访问者对象需要访问并调用每一个元素对象的操作,这意味着元素对象有时候必须暴露一些自己的内部操作和状态。

访问者模式的应用场景

  1. 一个对象结构包含多个类型的对象,希望对这些对象的具体类型做一些操作。
  2. 需要对一个对象结构中的对象进行很多不同的并且不相关的操作。
  3. 对象结构中对象对应的类很少改变,经常需要在对象结构中定义新的操作。

访问者模式的案例

// 抽象访问者
public abstract class Action {

    /**
     * 得到男性 的测评
     *
     * @param man man
     */
    public abstract void getManResult(Man man);

    /**
     * 得到女的 测评
     *
     * @param woman woman
     */
    public abstract void getWomanResult(Woman woman);
}

// 具体访问者
public class Success extends Action {

	@Override
	public void getManResult(Man man) {
		System.out.println(" 男人给的评价该歌手很成功 !");
	}

	@Override
	public void getWomanResult(Woman woman) {
		System.out.println(" 女人给的评价该歌手很成功 !");
	}

}


public class Wait extends Action {

    @Override
    public void getManResult(Man man) {
        System.out.println(" 男人给的评价是该歌手待定 ..");
    }

    @Override
    public void getWomanResult(Woman woman) {
        System.out.println(" 女人给的评价是该歌手待定 ..");
    }

}


public class Fail extends Action {

	@Override
	public void getManResult(Man man) {
		System.out.println(" 男人给的评价该歌手失败 !");
	}

	@Override
	public void getWomanResult(Woman woman) {
		System.out.println(" 女人给的评价该歌手失败 !");
	}

}


// 抽象元素
public abstract class Person {

    public abstract void accept(Action action);

}

// 具体元素
public class Man extends Person {

    @Override
    public void accept(Action action) {
        action.getManResult(this);
    }

}

public class Woman extends Person {

    @Override
    public void accept(Action action) {
        action.getWomanResult(this);
    }

}


// 对象结构
public class ObjectStructure {

    private final List<Person> persons = new LinkedList<>();

    public void attach(Person p) {
        persons.add(p);
    }

    public void detach(Person p) {
        persons.remove(p);
    }

    public void display(Action action) {
        for (Person p : persons) {
            p.accept(action);
        }
    }
}


public static void main(String[] args) {
	//创建ObjectStructure
	ObjectStructure objectStructure = new ObjectStructure();

	objectStructure.attach(new Man());
	objectStructure.attach(new Woman());

	//成功
	Success success = new Success();
	objectStructure.display(success);

	System.out.println("===============");
	Fail fail = new Fail();
	objectStructure.display(fail);

	System.out.println("=======给的是待定的测评========");

	Wait wait = new Wait();
	objectStructure.display(wait);
}

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值