java设计模式---模板方法
2013-11-13 21:53
169 查看
1.概念
(1)模板方法是基于继承的代码复用技术,在模板方法模式中,可以将相同的代码放在父类之中,而讲不同的方法实现放在不同 的子类之中。
(2)在模板方法之中,我们需要一个抽象类,将部分逻辑以具体方法以及具体构造函数的方式实现。然后声明一些抽象方法让子类实现剩余的逻辑。
(3)模板方法是一种类行为模式。
2.结构
模板方法模式包含的角色
AbstractClass :抽象类
ConcreteClass:具体子类
模板基本方法的组成部分:
抽象方法(AbstrsctCalss Method)
具体方法(Concrete Method)
钩子方法(Hook Method)
3.应用
广泛应用于框架技术(Spring、struts,TestCase..........).
4.模式扩展
好莱坞原则"( Don't call us,we'll call you)
(1)机制
子类不显式的调用父类的方法,而是通过覆盖父类的放法来实现某些具体的业务逻辑,【父类控制对子类的调用】
(2)体现
子类不要调用父类,而通过父类来调用子类,将某些实现的方法写在子类中,让父类来控制整个过程。
(3).钩子(Hook Method)方法的使用
1.使子类可以控制父类的行为
2.最简单的钩子方法就是空方法,也可以再钩子方法中定义一个默认的实现。如果子类不覆盖钩子方法,就执行父类默认实现的代码
3.复杂的钩子方法可以对其他的方法约束,这种钩子通常返回一个boolean类型(true或false),用来判断是否执行一个基本方法
4.示例:
public void temp{
open();
display();
if(isPrint())
{
print();
}}
//判断函数-----钩子方法
public boolean isPrint(){
return true;
}
5.模板方法的具体示例:
每家银行,有不同的存储类型(活期、定期等),因每家银行存储方式的利率不同,所以有不同的收益,请编程计算不同银行的年收益。收益=本金+(本金*利率)
Account接口类:
package com.accp.ven;
/**
* 计算收益的接口
* @author wen
*
*/
public interface Account {
/**获取收益*/
public double getinComing();
/**获取利率*/
public double getRate();
}
实现Account的类
package com.accp.ven;
/**
* 收益接口的实现类
* @author wen
*
*/
public abstract class BaseAccount implements Account {
private double balance;//余额
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
@Override
public double getinComing() {
return balance+(balance*getRate());
}
@Override
/**
* 不同的存储l类型有不同的利率,因此把次方法改写成abstract方法,供子类去实现(模板方法)
*/
public abstract double getRate();
}
package com.accp.ven;
import java.util.HashMap;
import java.util.Map;
/***
* 利率表
* @author wen
*
*/
public class RateTable {
private static Map<String, Double> map = new HashMap<String, Double>();
static{
map.put("a1", 0.1212);
map.put("a2", 0.012);
map.put("b1", 0.333);
}
/**
* 通过key-value获取value
*/
public static double getRateByType(String type) {
return map.get(type);
}
}
package com.accp.ven;
//工具类
public class AccountUtil {
private AccountUtil() {
}
public static double calc(Account act) {
return act.getinComing();
}
}
package com.accp.ven;
//农业银行
public class ABCAccount extends BaseAccount {
@Override
public double getRate() {
return RateTable.getRateByType("a2");
}
}
package com.accp.ven;
//邮政银行
public class YZAccount extends BaseAccount {
@Override
public double getRate() {
return RateTable.getRateByType("b1");
}
}
(1)模板方法是基于继承的代码复用技术,在模板方法模式中,可以将相同的代码放在父类之中,而讲不同的方法实现放在不同 的子类之中。
(2)在模板方法之中,我们需要一个抽象类,将部分逻辑以具体方法以及具体构造函数的方式实现。然后声明一些抽象方法让子类实现剩余的逻辑。
(3)模板方法是一种类行为模式。
2.结构
模板方法模式包含的角色
AbstractClass :抽象类
ConcreteClass:具体子类
模板基本方法的组成部分:
抽象方法(AbstrsctCalss Method)
具体方法(Concrete Method)
钩子方法(Hook Method)
3.应用
广泛应用于框架技术(Spring、struts,TestCase..........).
4.模式扩展
好莱坞原则"( Don't call us,we'll call you)
(1)机制
子类不显式的调用父类的方法,而是通过覆盖父类的放法来实现某些具体的业务逻辑,【父类控制对子类的调用】
(2)体现
子类不要调用父类,而通过父类来调用子类,将某些实现的方法写在子类中,让父类来控制整个过程。
(3).钩子(Hook Method)方法的使用
1.使子类可以控制父类的行为
2.最简单的钩子方法就是空方法,也可以再钩子方法中定义一个默认的实现。如果子类不覆盖钩子方法,就执行父类默认实现的代码
3.复杂的钩子方法可以对其他的方法约束,这种钩子通常返回一个boolean类型(true或false),用来判断是否执行一个基本方法
4.示例:
public void temp{
open();
display();
if(isPrint())
{
print();
}}
//判断函数-----钩子方法
public boolean isPrint(){
return true;
}
5.模板方法的具体示例:
每家银行,有不同的存储类型(活期、定期等),因每家银行存储方式的利率不同,所以有不同的收益,请编程计算不同银行的年收益。收益=本金+(本金*利率)
Account接口类:
package com.accp.ven;
/**
* 计算收益的接口
* @author wen
*
*/
public interface Account {
/**获取收益*/
public double getinComing();
/**获取利率*/
public double getRate();
}
实现Account的类
package com.accp.ven;
/**
* 收益接口的实现类
* @author wen
*
*/
public abstract class BaseAccount implements Account {
private double balance;//余额
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
@Override
public double getinComing() {
return balance+(balance*getRate());
}
@Override
/**
* 不同的存储l类型有不同的利率,因此把次方法改写成abstract方法,供子类去实现(模板方法)
*/
public abstract double getRate();
}
package com.accp.ven;
import java.util.HashMap;
import java.util.Map;
/***
* 利率表
* @author wen
*
*/
public class RateTable {
private static Map<String, Double> map = new HashMap<String, Double>();
static{
map.put("a1", 0.1212);
map.put("a2", 0.012);
map.put("b1", 0.333);
}
/**
* 通过key-value获取value
*/
public static double getRateByType(String type) {
return map.get(type);
}
}
package com.accp.ven;
//工具类
public class AccountUtil {
private AccountUtil() {
}
public static double calc(Account act) {
return act.getinComing();
}
}
package com.accp.ven;
//农业银行
public class ABCAccount extends BaseAccount {
@Override
public double getRate() {
return RateTable.getRateByType("a2");
}
}
package com.accp.ven;
//邮政银行
public class YZAccount extends BaseAccount {
@Override
public double getRate() {
return RateTable.getRateByType("b1");
}
}
相关文章推荐
- java设计模式之模板方法模式Template method
- Java设计模式之模板方法模式在android中的实例
- Java设计模式之--模板方法模式(Template Method)
- Java设计模式之模板方法模式(Template Method)
- Java设计模式透析之 —— 模板方法(Template Method)
- 设计模式学习笔记---模板方法模式template method pattern(Java版)
- Java设计模式——模板方法模式
- 举例讲解Java设计模式编程中模板方法模式的运用实例
- Java设计模式:模板方法模式
- Java--设计模式之模板方法模式
- java设计模式——模板方法模式
- Java设计模式(16)——行为模式之模板方法模式(Template)
- java设计模式(八)--模板方法模式
- Java设计模式之模板方法模式(Template Method)
- Java基础——继承+子父类相关特点+Final关键字+抽象类+模板方法设计模式+接口
- Java设计模式透析之 —— 模板方法(Template Method)
- Java设计模式之模板方法设计模式
- Java设计模式透析之 —— 模板方法(Template Method)
- java设计模式7.策略模式、模板方法模式、观察者模式
- Java设计模式之模板方法模式(Template Method)