访问者模式,记者街访

一位记者做街头访问的节目并赠送礼物,如果采访的是女性送一朵玫瑰花男的送一只钢笔。

战争是男人的事让女人走开。


模式定义:访问者模式即表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作

案例说明:案例中男人和女人这两种元素是稳定的,记者(访问者)对不同的性别(稳定的数据)送出了不同的礼物(操作)。

                  战争是男人的事让女人走开,战争是一个访问者,对男人和女人这两组元素有着不同的操作,男人参加战争女人远离战争。

优点:在不改变元素下,解耦操作,拓展操作

注意:使用时应考虑元素的稳定性(一般是元素的个数),元素变化所有的访问者都要改动。 元素上的操作是否频繁可变。

代码:首先定义抽象类human并接受访问者

public abstract class Human {
    //名字
    protected String name;

    public Human(String name) {
        this.name = name;
    }
    /**
     * 接受访问者访问
     * @param visitor
     */
    public abstract void accept(Visitor visitor);
}
男人
public class Man extends Human{

    public Man(String name) {
        super(name);
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visitor(this);//关键代码 将自身引用传入访问者
    }
}
女人
public class Woman extends Human {

    public Woman(String name) {
        super(name);
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visitor(this);//关键代码 将自身引用传入访问者
    }
}
访问者
public interface Visitor {
    //访问男人
    void visitor(Man man);
    //访问女人
    void visitor(Woman woman);
}
记者(访问者)
public class ReporterVisitor implements Visitor{
    @Override
    public void visitor(Man man) {
        System.out.println(man.name + "获得了一块钢笔");
    }

    @Override
    public void visitor(Woman woman) {
        System.out.println(woman.name + "获得了一束玫瑰");
    }
}
战争(访问者)
public class WarVisitor implements Visitor {
    @Override
    public void visitor(Man man) {
        System.out.println(man.name + "参加战争");
    }

    @Override
    public void visitor(Woman woman) {
        System.out.println(woman.name + "远离战争");
    }
}
测试
public class Test {
    public static void main(String args[]) {
        //稳定的数据男人 女人
        Man man = new Man("佐为");
        Woman woman = new Woman("雪莉");
        //记者访问者
        Visitor reporterVisitor = new ReporterVisitor();
        reporterVisitor.visitor(man);
        reporterVisitor.visitor(woman);
        //战争访问者
        Visitor warVisitor = new WarVisitor();
        warVisitor.visitor(man);
        warVisitor.visitor(woman);
    }
}
结果
佐为获得了一只钢笔
雪莉获得了一束玫瑰
佐为参加战争
雪梨远离战争

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值