实例探索Java模式之路——模版方法模式

xiaoxiao2021-02-28  78

模版方法模式 1、模版方法模式是类的行为模式。 准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法迫使子类实现剩余的逻辑。 不同的子方法可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。 模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心。 2、基本结构: 抽象模版: 1、定义一个或者多个抽象操作,让子类实现,这些操作叫做基本操作。 2、定义并实现一个模版方法。这个模版方法是一个具体方法,它给出了一个顶级逻辑框架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也可能调用一些具体方法。 具体模版: 1、实现父类所定义的一个或多个抽象方法,他们是一个顶级逻辑的组成步骤。 2、每一个抽象模版角色都可以有任意多个具体模版角色与之对应,而每一个具体模版角色都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。 3、一个示意性的例子: //抽象模版类 public abstract class AbstractClass { // 模版方法的声明和实现,顶级逻辑的方法代表 public void TemplateMethod() { // 调用基本方法(子类实现) doOperate1();// 顶级逻辑的组成步骤 // 调用基本方法(子类实现) doOperate2();// 顶级逻辑的组成步骤 // 调用基本方法(已经实现) doOperate3(); } // 基本方法声明1 protected abstract void doOperate1(); // 基本方法声明2 protected abstract void doOperate2(); // 基本方法声明3(实现) private final void doOperate3() { System.out.println("模版方法具体实现3"); } } //具体策模版类 public class ConcreteClass extends AbstractClass { // 基本方法1(子类实现) @Override protected void doOperate1() { System.out.println("基本方法1,子类实现"); doOperate2();// 可以调用 // doOperate3();//不应当这样调用 } // 基本方法2(子类实现) @Override protected void doOperate2() { System.out.println("基本方法2,子类实现"); } } //客户端 public class client { public static void main(String[] args) { AbstractClass ab = new ConcreteClass(); ab.TemplateMethod(); } } 4、一个计算存款利息的例子: //抽象模版类,给出顶级逻辑 abstract public class Account { protected String accountNumber;// 帐号 // 无参构造,初始化帐号 public Account() { accountNumber = null; } // 构造方法 public Account(String accountNumber) { this.accountNumber = accountNumber; } // 模版方法,计算利息数额 final public double calculateInterest() { // 得到利率 double interestRate = doCalculateInterestRate(); // 得到帐号类型 String accountType = doCalculateAccountType(); // 得到帐号金额 double amount = calculateAccount(accountType, accountNumber); // 计算利息数额 return amount * interestRate; } // 调用基本方法(子类实现) abstract protected String doCalculateAccountType(); // 调用基本方法(子类实现) abstract protected double doCalculateInterestRate(); // 基本方法声明(实现) final public double calculateAccount(String accountType, String accountNumber) { // 查询数据库得到传入的账户类型和号码查询得到金额,返回帐号金额 return 100000.00D; } } //具体子类 public class MoneyMarketAccount extends Account { // 基本方法(子类实现) @Override protected String doCalculateAccountType() { return "Certificate of Deposite"; } // 基本方法(子类实现) @Override protected double doCalculateInterestRate() { return 0.035D; } } //具体子类 public class CDAccount extends Account { // 基本方法(子类实现) @Override protected String doCalculateAccountType() { return "Certificate of Deposite"; } // 基本方法(子类实现) @Override protected double doCalculateInterestRate() { return 0.065D; } } import java.text.NumberFormat; //客户端 public class client { private static Account acttAccount = null; // 金额格式化 private static String formateCurrency(double amnt) { return NumberFormat.getCurrencyInstance().format(amnt); } public static void main(String[] args) { acttAccount = new MoneyMarketAccount(); System.out.println("Interest from market account" + formateCurrency(acttAccount.calculateInterest())); acttAccount = new CDAccount(); System.out.println("Interest from CD account" + formateCurrency(acttAccount.calculateInterest())); } } 5、模版方法模式中的方法(模版方法和基本方法) 模版方法:一个模版方法是定义在抽象类中,把基本操作方法组合在一起形成一个总的算法或者总的一个行为。一个抽象类可以有任意多个模版方法,每一个模版方法都可以任意调用任意多个具体放方法。 基本方法:(抽象方法、具体方法,钩子方法) 钩子方法:由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实现。例如上面的方法(doCalculateInterestRate()、doCalculateAccountType())实现方式就是钩子方法。钩子方法命名应当以do开始。

通过此实例,相信对该模式有了进一步的认识。

每天努力一点,每天都在进步。

转载请注明原文地址: https://www.6miu.com/read-26202.html

最新回复(0)