访问者
意义 与 场景
关于访问者模式,用处比较局限。其实就是不改变内部实际运行过程而动态的修改内部属性的一种模式。内部实际运行过程时固定的,但是变量不是固定的。那么对于这种这个不固定的变量而固定的运行过程就是访问者模式了,
这个需要先举一个例子,是我用到的真实案例。先介绍一下,我们都知道oracle和mysql的日期格式处理都是不一样的。那么对于数据持久化日期的查询与保存都是不一样的内容,但是对于这个保存或查询时间的动作都是固定的。那么这样我们就可以运用到这个模式了。不同的时间内容就是不同的访问者了。
// 访问者的接口
interface DBDateable {
String date();
}
// mysql类型的访问者
class mysqlDate implements DBDateable {
@Override
public String date() {
return new SimpleDateFormat("yyyyMMddHHmmss.SSS").format(new Date());
}
}
// oracle 类型的访问者
class oracleDate implements DBDateable {
@Override
public String date() {
return new SimpleDateFormat("YYYY-MM-dd HH:mm:ss.SSS").format(new Date());
}
}
//实际操作类
class Save {
public void saveDate(DBDateable dbDate) {
System.out.println(dbDate.date());
}
}
// 测试使用方法
public class DBDate {
public static void main(String[] args) {
Save s = new Save();
s.saveDate(new mysqlDate());
s.saveDate(new oracleDate());
}
}
说明
通过这个简单的例子来说,save类是固定的只有一个save方法。也不会再save中增加其他的方法。所以说save是固定的。而对于两个访问者mysql与oracle 来说实现了访问者接口。那么save实际操作类不用管到底是什么类型的数据库时间,拿来直接操作即可。这个是不变的。即使以后出现其他数据库与其他格式的时间,这里的save永远都不需要改变,只需要构造不同的访问者来实现时间格式的格式化即可。若save经常的变动需要不断的增加或者修改方法,那么对于访问者也要不断的修改,对于这类场景那么这个模式是不可以的。只适用于固定格式。