设计模式-模板方法模式
基于继承的代码复用基本技术,可以将相同的代码放到父类中,而将不同的方法实现放在不同的子类中。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。体现了面向对象的众多重要思想,使用频率较高。
定义一个操作中算法的框架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,是一种类行为型模式。
import org.json.XML;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import java.net.URL;
abstract class Account{
public boolean validate(String account,String password){
System.out.println("账号:"+account+",密码:"+password);
if(account.equals("张三") && password.equals("123456")){
return true;
}
return false;
}
public abstract void calcateInterest();
public void display(){
System.out.println("显示利息");
}
public void handle(String account,String password){
if(!validate(account,password)){
System.out.println("密码错误");
return;
}
calcateInterest();
display();
}
}
class CurrentAccount extends Account{
public void calcateInterest() {
System.out.println("活期计算利息");
}
}
class SaveingAccount extends Account{
public void calcateInterest() {
System.out.println("定期计算利息");
}
}
public class TemplatePattern {
public static void main(String[] args){
Account account= (Account)XMLUtil.getBean();
account.handle("张三","123456");
}
}
钩子方法的使用
abstract class DataView{
public abstract void getData();
public void convertData(){
System.out.println("将数据转换为XML格式");
}
public abstract void displayData();
public boolean isNotXMLData(){
return true;
}
public void process(){
getData();
if(isNotXMLData()){
convertData();
}
displayData();
}
}
class SubDataViewr extends DataView{
public void getData() {
System.out.println("从XML文件中去获取数据");
}
public void displayData() {
System.out.println("以柱状图显示数据");
}
// public boolean isNotXMLData(){
// return false;
// }
}
public class TemplatePattern {
public static void main(String[] args){
DataView v=new SubDataViewr();
v.process();
}
}
子类控制父类的行为, 对其他方法进行约束。
钩子方法。