访问者(Visitor)模式

课本实例:男人和女人

关键在于人只分为了男人和女人,性别的分类是稳定的,所以可以在状态类中增加‘男人反应’和‘女人反应两个方法’,方法个数稳定,不容易发生变化。 而‘人’类中只有一个方法‘接受’,获得相应的状态。对象结构类针对不同的‘状态’遍历‘男人’和‘女人’,得到不同的反应。

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 Women extends Person { //女人类
    @Override
    public void Accept(Action visitor) {
        visitor.getWomenConclusion(this);
    }
}


public abstract class Action { //状态的抽象类

    //得到男人的结论或反应
    public abstract void getManConclusion(Man concreteElementA);
    //得到女人的结论或反应
    public abstract void getWomenConclusion(Women concreteElementA);
}


public class Success extends Action{//具体状态类:成功
    @Override
    public void getManConclusion(Man concreteElementA) {
        System.out.println("男人成功时,背后多半有一个伟大的女人");
    }

    @Override
    public void getWomenConclusion(Women concreteElementA) {
        System.out.println("女人成功时,背后多半有一个不成功的男人");
    }
}


public class Failing extends  Action{ //具体状态类:失败
    @Override
    public void getManConclusion(Man concreteElementA) {
        System.out.println("男人失败时,闷头喝酒,谁也不用劝。");
    }

    @Override
    public void getWomenConclusion(Women concreteElementA) {
        System.out.println("女人失败时,眼泪汪汪,谁也劝不了。");
    }
}


import java.util.ArrayList;
import java.util.List;
public class ObjectStructure { //对象结构
    private List<Person> elements = new ArrayList<Person>();

    public void Attach(Person pp) {  //增加
        elements.add(pp);
    }

    public void Detach(Person pp) { //移除
        elements.remove(pp);
    }

    public void Display(Action vistor) { //查看显示
        for (Person e : elements) { //针对不同状态遍历男人与女人,得到不同的反应
            e.Accept(vistor);
        }
    }
}


public class Client {
    public static void main(String[] args) {
        //在对象结构中加入要对比的男人与女人
        ObjectStructure o = new ObjectStructure();
        o.Attach(new Man());
        o.Attach(new Women());

        //成功时的反应
        Success v1 = new Success();
        o.Display(v1);
        //失败时的反应
        Failing v2 = new Failing();
        o.Display(v2);
    }
}

UML:

拓展实例:

扩展客户管理的功能(CRM)。

(1)个人客户、企业客户。

(2)提出服务申请、客户价值分析、客户对产品偏好分析等。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值