维护公司网站建设,网站拥有者查询,电子商务平台企业的网络组织类型是,活动策划书模板范文访问者模式 这个模式用的很少#xff0c;《设计模式》的作者评价为#xff1a; 大多情况下#xff0c;你不需要使用访问者模式#xff0c;但是一旦需要使用它时#xff0c;那就真的需要使用了 一、测评系统的需求
1)将观众分为男人和女人#xff0c;对歌手进行测评…访问者模式 这个模式用的很少《设计模式》的作者评价为 大多情况下你不需要使用访问者模式但是一旦需要使用它时那就真的需要使用了 一、测评系统的需求
1)将观众分为男人和女人对歌手进行测评当看完某个歌手表演后得到他们对该歌手不同的评价(评价 有不同的种类比如 成功、失败 等) 二、 传统方式的问题分析
1)如果系统比较小还是 ok 的但是考虑系统增加越来越多新的功能时对代码改动较大违反了 ocp 原则不利于维护
2)扩展性不好比如 增加了 新的人员类型或者管理方法都不好做
3)引出我们会使用新的设计模式 – 访问者模式 三、 访问者模式基本介绍
1)访问者模式Visitor Pattern封装一些作用于某种数据结构的各元素的操作它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
2)主要将数据结构与数据操作分离解决 数据结构和操作耦合性问题
3)访问者模式的基本工作原理是 在被访问的类里面加一个对外提供接待访问者的接口
4)访问者模式主要应用场景是 需要对一个对象结构中的对象进行很多不同操作(这些操作彼此没有关联)同时需要避免让这些操作污染这些对象的类可以选用访问者模式解决
四、访问者模式的原理类图 对原理类图的说明-即(访问者模式的角色及职责)
1)Visitor 是抽象访问者为该对象结构中的 ConcreteElement 的每一个类声明一个 visit 操作
2)ConcreteVisitor 是一个具体的访问者 实现每个有 Visitor 声明的操作是每个操作具体实现的部分.
3)ObjectStructure 能枚举它的元素 可以提供一个高层的接口用来允许访问者访问元素
4)Element 定义一个 accept 方法接收一个访问者对象
5)ConcreteElement 为具体元素实现了 accept 方法
五、访问者模式应用实例
1)将人分为男人和女人对歌手进行测评当看完某个歌手表演后得到他们对该歌手不同的评价(评价 有不同的种类比如 成功、失败 等)请使用访问者模式来说实现
2)思路分析和图解(类图) 3)代码实现
Action抽象的操作类他里面是抽象的操作方法
public abstract class Action {//得到男性 的测评public abstract void getManResult(Man man);//得到女的 测评public abstract void getWomanResult(Woman woman);
}
主函数
public class Client {public static void main(String[] args) {//创建 ObjectStructureObjectStructure 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);}
}
Fail
public class Fail extends Action {Overridepublic void getManResult(Man man) {System.out.println( 男人给的评价该歌手失败 !);}Overridepublic void getWomanResult(Woman woman) {System.out.println( 女人给的评价该歌手失败 !);}
}
Man
public class Man extends Person {Overridepublic void accept(Action action) {action.getManResult(this);}
}
ObjectStructure数据结构
//数据结构管理很多人Man , Woman
public class ObjectStructure {//维护了一个集合private ListPerson persons new LinkedList();//增加到 listpublic 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);}}}
Person抽象的人 类
public abstract class Person {//提供一个方法让访问者可以访问public abstract void accept(Action action);
}
Success
public class Success extends Action {Overridepublic void getManResult(Man man) {System.out.println( 男人给的评价该歌手很成功 !);}Overridepublic void getWomanResult(Woman woman) {System.out.println( 女人给的评价该歌手很成功 !);}
}
Wait
public class Wait extends Action {Overridepublic void getManResult(Man man) {System.out.println( 男人给的评价是该歌手待定 ..);}Overridepublic void getWomanResult(Woman woman) {System.out.println( 女人给的评价是该歌手待定 ..);}
}
Woman
//说明
//1. 这里我们使用到了双分派, 即首先在客户端程序中将具体状态作为参数传递 Woman 中(第一次分派)
//2. 然后 Woman 类调用作为参数的 具体方法 中方法 getWomanResult, 同时将自己(this)作为参数
// 传入完成第二次的分派
public class Woman extends Person{Overridepublic void accept(Action action) {action.getWomanResult(this);}}
六、访问者模式的注意事项和细节
优点
1)访问者模式符合单一职责原则、让程序具有优秀的扩展性、灵活性非常高
2)访问者模式可以对功能进行统一可以做报表、UI、拦截器与过滤器适用于数据结构相对稳定的系统
缺点
1)具体元素对访问者公布细节也就是说访问者关注了其他类的内部细节这是迪米特法则所不建议的, 这样造成了具体元素变更比较困难
2)违背了依赖倒转原则。访问者依赖的是具体元素而不是抽象元素
3)因此如果一个系统有比较稳定的数据结构又有经常变化的功能需求那么访问者模式就是比较合适的.
七、理解 通过ObjectStrcure传入对应的person的实现类并调用其accept()并传入具体的action的实现类 Perosn下面的具体实现类如Man类他的accept()方法里面又调用了传入的action的方法并把自己传入(this) 就是man调用accept()并传入了fail在man的accept方法中调用了fail的方法这个fail的方法又想要传入man类所以就出现了双生派 张三李四去按摩店例子
想到了个例子
张三和李四访问按摩店寻找按摩店的技师
------------------------
把张三李四抽象成Element抽象类为Perosn抽象类
Perosn抽象类里面有一个抽象方法呼叫技师call()方法
按摩店技师抽象成Visitor抽象类访问者也就是Technician抽象类
Technician抽象类里面有两个实现类1、金油技师2、腿部技师
他们分别对应对张三按摩方法makeToZhangsan()、对李四按摩方法makeToLisi()
技师Technician抽象类下面有两个实现一个是金油技师oilTech类一个是腿部技师LegsTech类
他们会实现对应的对张三按摩方法makeToZhangsan()、对李四按摩方法makeToLisi()并要求传入服务对象也就是Zhansan类还是Lisi类
Person抽象类有两个实现类一个是张三Zhansan类一个是李四Lisi类
他们实现call()方法并作出了实现这个方法传入我们要叫的具体技师如金油技师oilTech类
在这个call()方法中调用对应技师的服务张三方法makeToZhansan()或对李四按摩方法makeToLisi()
--------------------------
最后在ObjectStructure也就是对应的按摩中心的一个集合里面有增加服务对象方法attch()和移除服务对象方法detach()都是传入对应服务对象
通过这个集合来管理按摩中心的服务的人如张三、李四
然后有一个服务方法make去传入对应技师然后遍历调用对应里面服务服务对象的call()方法去呼唤技师。