Skip to content
BBaskaran

Template Method

Define an algorithm's skeleton and let subclasses override specific steps.

Use it when

Several classes share an algorithm's structure but differ in a few steps.

// Template
interface IDocument {
	[id: string]: string;
}

abstract class AbstractDocument {
	document: IDocument = {};
	abstract title(doc: IDocument): void;
	abstract content(doc: IDocument, text: string): void;
	author(doc: IDocument): void {
		doc["author"] = "Baskaran";
	}
	print(doc: IDocument): void {
		console.log("=-=-=-=-=-=-=-=-=-");
		Object.keys(doc).forEach((attribute: string) => {
			console.log("Attibute => " + attribute + "	" + doc[attribute]);
		});
		console.log("=-=-=-=-=-=-=-=-=-");
	}
	createDoc(text: string): void {
		this.title(this.document);
		this.content(this.document, text);
		if (this.author) {
			this.author(this.document);
		}
		this.print(this.document);
	}
}

class TextDocument extends AbstractDocument {
	title(doc: IDocument,): void {
		doc["title"] = " New Text Document"
	}
	content(doc: IDocument, text: string): void {
		doc["content"] = text;
	}
	author(doc: IDocument) {
		doc["author"] = "Baskaran B";
	}
}

class HTMLDocument extends AbstractDocument {
	title(doc: IDocument): void {
		doc["title"] = " New HTML Page"
	}
	content(doc: IDocument, text: string): void {
		let html: string = "Title comes here 
";
		html += "					<p>" + text + "</p>";
		doc["content"] = html;
	}

}

const clientCode = () => {
	const txt = new TextDocument();
	txt.createDoc("God is Love");
	const html = new HTMLDocument();
	html.createDoc("God is Love");
}