modo de plantilla se usa comúnmente como un patrón de diseño del comportamiento, la idea principal es definir un código de proceso esqueleto en la plantilla, y algunos de los métodos utilizados en el código esqueleto no implementa estos métodos que dejan a las subclases de lograr. Si tenemos un escenario de desarrollo de negocios, nuestras necesidades de sistemas de negocio a consultas de los distintos informe de crédito los canales de crédito, el contenido de cada salida del actuador no es lo mismo, sino que se divide en tres pasos para establecer una conexión, el acceso al contenido de la memoria original, el análisis sintáctico la presentación de informes y el almacenamiento. De esta manera, se define una clase de plantilla:
public abstract class AbstractReportTemplate {
protected Logger logger = LoggerFactory.getLogger(getClass());
public final void doTask(){
doConnect();
getReport();
parseRepot();
}
/**
* 建立连接
*/
public abstract void doConnect();
/**
* 获取报告
*/
public abstract void getReport();
/**
* 解析报告并落库
*/
public abstract void parseRepot();
}
Si ahora queremos atracar Un agencias de crédito, que en tanto que heredamos esta clase de plantilla, para lograr lo anterior métodos abstractos puede, tarea de flujo sin cambios.
public class AReport extends AbstractReportTemplate {
public void doConnect() {
logger.info("do connect");
}
public void getReport() {
logger.info("get report");
}
public void parseRepot() {
logger.info("parseReport");
}
}
Método de llamada:
public static void main(String[] args){
AbstractReportTemplate aReport = new AReport();
aReport.doTask();
}
Visible, el modo de plantilla muy sencillo de implementar. Ahora voy a introducir varias patrón de plantilla en el código fuente.
1.jdk la clase InputStream es una clase de plantilla, que define el método de lectura abstracto
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c;
int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
}
} catch (IOException ee) {
}
return i;
}
public abstract int read() throws IOException;
Hay muchos clase de implementación, como se muestra a continuación:
Aquí está el ByteArrayInputStream de:
public synchronized int read() {
return (pos < count) ? (buf[pos++] & 0xff) : -1;
}
La fuente de datos se utiliza para inicializar 2.jdbc AbstractDataSourceInitializer
@PostConstruct
protected void initialize() {
if (!isEnabled()) {
return;
}
ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
String schemaLocation = getSchemaLocation();
if (schemaLocation.contains(PLATFORM_PLACEHOLDER)) {
String platform = getDatabaseName();
schemaLocation = schemaLocation.replace(PLATFORM_PLACEHOLDER, platform);
}
populator.addScript(this.resourceLoader.getResource(schemaLocation));
populator.setContinueOnError(true);
customize(populator);
DatabasePopulatorUtils.execute(populator, this.dataSource);
}
protected abstract DataSourceInitializationMode getMode();
protected abstract String getSchemaLocation();
La realización BatchDataSourceInitializer
@Override
protected DataSourceInitializationMode getMode() {
return this.properties.getInitializeSchema();
}
@Override
protected String getSchemaLocation() {
return this.properties.getSchema();
}
Texto Fuente: https: //github.com/jinjunzhu/design-pattern.git
Microcanal número público, atención de bienvenida, aprender a crecer juntos