ä»åã¯ï¼Visitorãã¿ã¼ã³ï¼ä¸è¨ã§ããã¨ãã¼ã¿æ§é ï¼ã¤ã¾ãã¢ãã«ï¼ã«Visitï¼è¨ªåï¼ãã¦å¦çãããã¿ã¼ã³ï¼ç®çã¯ã¢ãã«ã¨ã¢ãã«ãå¦çãããã¸ãã¯ã®åé¢ã§ãï¼å®ã¯ä½¿ã£ããã¨ããªãï½ ããæ©ä¼ãªã®ã§èãã¦ã¿ããã¨æãã¾ãï¼
ã¾ãã¯äºä¾ãã
ãã¤ãã®ãã¨ã,ãã¤ã¡ããã®サンプルãæ¹ç·¨ï¼
ã¢ãã«ã«ç´æ¥ãã¸ãã¯ãæ¸ãã®ã§ã¯ãªãï¼Visitorãåãå
¥ãã¦ãã®Visitorã«ã¢ãã«ï¼èªåèªèº«ï¼ã渡ãï¼ãã¸ãã¯ãå®è¡ããã¤ã¡ã¼ã¸ã§ãï¼
ãããããã¨ã§ã¢ãã«ã¨ãã¸ãã¯ãåé¢ã§ããã¨ãããã¿ã¼ã³ãªãã§ããï¼åConverterã®convertã¡ã½ããã§æ¸¡ãããTable, Columnã®ã¢ãã«ã«ç¨æããVisitorã訪åããã¦å¦çããã¦ãã¾ãï¼
public interface Acceptor { public void accept(Visitor visitor, StringBuilder result); }
acceptã¡ã½ããã§ã¯ï¼å¼æ°ã«æ¸¡ãããVisitor#visitãèªãã§ãã¾ãï¼ãããããã«ãã£ã¹ãããã¨å¼ã³ã¾ãï¼Acceptorã¨Visitorã®çµã¿åããã§visitã®å¦çãå¤åããã¨ãããã¨ã§ããï¼
public class Column implements Acceptor { public String name; public String type; public Column(String name, String type) { this.name = name; this.type = type; } public void accept(Visitor visitor, StringBuilder result) { visitor.visit(this, result); } }
import java.util.List; public class Table implements Acceptor { public String name; public List<Column> columns; public Table(String name) { this.name = name; } public void accept(Visitor visitor, StringBuilder result) { visitor.visit(this, result); } }
public interface Visitor { void visit(Table table, StringBuilder result); void visit(Column column, StringBuilder result); }
Tableããå¾ãããColumnã®å¦çã¯ï¼Columnèªä½ã«Visitorï¼èªåèªèº«ï¼ã訪åããã¦å¦çãã¦ãã¾ãï¼Visitorã®æ¸¡ãæ©ãã§ããï¼Tableã¨Columnã®èå¥ã¯Visitor#visitã¡ã½ããã®ãªã¼ãã¼ãã¼ãã§ä»£ç¨ãã¦ãã¾ãï¼ã³ã¼ãããã£ãããã¦ã¾ããï¼
public class MySQLVisitorImpl implements Visitor { public void visit(Table table, StringBuilder result) { result.append("CREATE TABLE ").append(table.name).append("(\n"); for (Column column : table.columns) { column.accept(this, result); } result.delete(result.length() - 2, result.length() - 1); result.append(");\n"); } public void visit(Column column, StringBuilder result) { result.append(" ").append(column.name).append(" "); if ("integer".equals(column.type)) { result.append("INT"); } else if ("string".equals(column.type)) { result.append("TEXT"); } else { result.append(column.type); } result.append(",\n"); } }
public class PostgreSQLVisitorImpl implements Visitor { public void visit(Table table, StringBuilder result) { result.append("CREATE TABLE ").append(table.name).append("(\n"); for (Column column : table.columns) { column.accept(this, result); } result.delete(result.length() - 2, result.length() - 1); result.append(");\n"); } public void visit(Column column, StringBuilder result) { result.append(" ").append(column.name).append(" "); if ("integer".equals(column.type)) { result.append("INTEGER"); } else if ("string".equals(column.type)) { result.append("VARCHAR(32)"); } else { result.append(column.type); } result.append(",\n"); } }
åVisitorã¯nameå±æ§ä»ãã§diconä¸ã«å®ç¾©ããã¦ããã¨ãã¦ï¼visitorããããã£ã«Bindingã¢ããã¼ã·ã§ã³ã§DIããVisitorãæå®ãã¾ãï¼
public class MySQLConverter implements Converter { @Binding("mySQLVisitor") public Visitor visitor; public String convert(Table table) { StringBuilder result = new StringBuilder(); table.accept(visitor, result); return result.toString(); } }
public class PostgreSQLConverter implements Converter { @Binding("postgreSQLVisitor") public Visitor visitor; public String convert(Table table) { StringBuilder result = new StringBuilder(); table.accept(visitor, result); return result.toString(); } }
ããï¼åã³ã³ãã¼ã¿ã®convertãåãå¦çã«ãªã£ã¦ãã¾ãã¾ããï¼
ã§ã¯ï¼æ½è±¡ã¯ã©ã¹ã«ã¾ã¨ãã¦convertã¡ã½ãããä¸æ¬åãã¦ããã¾ãããï¼
public abstract class AbstractSQLConverter implements Converter { private Visitor visitor; public String convert(Table table) { StringBuilder result = new StringBuilder(); table.accept(visitor, result); return result.toString(); } public void setVisitor(Visitor visitor) { this.visitor = visitor; } }
ãã¨ã¯ï¼è¨ªåããVisitorã ããå¤ãã¾ãããï¼ããã§ãã£ãããã¾ããï¼
public class MySQLConverter extends AbstractSQLConverter { @Binding("mySQLVisitor") @Override public void setVisitor(Visitor visitor) { super.setVisitor(visitor); } }
public class PostgreSQLConverter extends AbstractSQLConverter { @Binding("postgreSQLVisitor") @Override public void setVisitor(Visitor visitor) { super.setVisitor(visitor); } }
ã¾ã¨ã
ç§ã¯ï¼ã¢ãã«ã¨ãã¸ãã¯ãå¥ã
ã«ä½ãï¼ãã¸ãã¯ã«å¦ç対象ã®ã¢ãã«ãé¢é£ä»ããã¨ãããã¨ã¯ãããã£ã¦ããã®ã§ããï¼Daoãã¿ã¼ã³ã®ãããªãã®ï¼ï¼ãã®ãããªãã¿ã¼ã³ã¯ä½¿ã£ããã¨ããã¾ããã§ããï¼
ãã®ãã¿ã¼ã³ã®å ´åã¯ï¼éã«ã¢ãã«ã«ãã¸ãã¯ãé¢é£ä»ãããã¿ã¼ã³ãªãã§ããï¼ããããã¢ãã«ä¸å¿ã«ãã¸ãã¯ãèããªããã°ãªããªã°ãå ´åã¯ä½¿ãããããã¿ã¼ã³ãªãã§ãããï¼
å°ãªãã¨ãï¼ã¢ãã«ã«ç´æ¥ãã¸ãã¯ãæ¸ããããå¾ãªããªãï¼Visitorãã¿ã¼ã³ã«ããã¹ãã ã¨æãã¾ãï¼ä»¥ä¸ï¼ãåèã¾ã§ã«ï¼
追è¨ï¼StringBuilderã¯å¼æ°ã«æããã¦ãã¾ããï¼Visitorã®ããããã£ã«ããã»ããããããããã¾ããï¼