栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

访问者模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

访问者模式

访问者模式 定义

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

适用场景

适用于数据结构相对稳定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。

目的

把处理从数据结构分离处理。如果系统有比较稳定的数据结构,又有易于变化的算法,使用访问者模式是比较合适的,因为访问者模式使得状态操作的增加变得容易。

优点

加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。

缺点

使得增加新的数据结构变得困难。

UML

用例

男人和女人的区别

状态的抽象类:

abstract class Action{
    //得到男人结论或反应
    public abstract void getManConclusion(Man concreteElementA);
    //得到女人结论或反应
    public abstract void getMomanConclusion(Woman concreteElementB);
}

人的抽象类

abstract class Person{
    //接受
    public abstract void accept(Action action);
}

状态的具体类

//成功
class Success extends Action{
	@override
    public void getManConclusion(Man concreteElementA){
        System.out.println(concreteElementA.getType().Name + this.getType().Name + “时,背后多半有一个伟大的女人”
    }
	@override
    public void getWomanConclusion(Woman concreteElementB){
        System.out.println(concreteElementA.getType().Name + this.getType().Name + “时,背后多半有一个不成功的男人”);
    }
}

//失败
class Failing extends Action{
    //与上面代码同类,省略
}

//恋爱
class Emotiveness extends Action{
    //与上面代码类似,省略
}

男人类和女人类

//男人
class Man extends Person{
	@override
    public void accept(Action action){
        action. getManConclusion(this);//双分派技术
    }
}

//女人
class Woman extends Person{
	@override
    public void accept(Action action){
        action. getManConclusion(this);
    }
}

对象结构

class ObjectStructure{
    private IList elements = new List();
    //增加
    public void attach(Person element) {
        element.Add(element);
    }

    //移除
    public void detach(Person element){
        element.Remove(element);
    }

    //查看
    public void display(Action action);{
       foreach(Person e in elements){
           e.Accept(action);
       }
    }
}

客户端

static void Main(string[] args){
    ObjectStructure o = new ObjectStructure();
    o.attach(new Man());
    o.attach(new Woman());
    
    //成功时的反应
    Success v1 = new Success();
    0.display(v1);
    
    Failing v2 = new Failing();
    0.display(v2);

    Amativeness v3 = new Amativeness();
    0.display(v1);
}

如果想增加一个婚姻状态,则只需要增加:

class Marriage:Action{
	@override
    public void getManConclusion(Man concreteElementA){
    System.out.println(concreteElementA.getType().Name + this.getType().Name + “是感慨道:恋爱游戏结束时,‘有期徒刑’摇无期。”);
    }
    @override
    public void getWomanConclusion(Woman concreteElementB) {
        ……
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459920.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号