`
java苹果+番茄
  • 浏览: 67931 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

模板方法(Template Method)模式【行为模式第十篇】

 
阅读更多
模板方法(Template Method)模式
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类
实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意

一、涉及到的角色
抽象模板角色有如下责任:
1、定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶极逻辑的组成步骤。
2、定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶极逻辑的骨架,而逻辑的组成
      步骤在相应的抽象操作中,推迟到子类实现。顶极逻辑也有可能调用一些具体方法。

具体模板角色有如下责任:
1、实现父类所定义的一个或多个抽象方法,它们是一个顶极逻辑的组成步骤。
2、每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色可以给出这些抽象方法(也就
   是顶极逻辑的组成步骤)的不同实现,从而使得顶极逻辑的实现各不相同。

//抽象模板类
		public abstract class AbstractClass{
			//模板方法的声明和实现
			public void TemplateMethod(){
				//调用基本方法(由子类实现,以下都是)
				doOperation1();
				
				doOperation2();
				
				doOperation3();(已经实现)
			}
			
			protected abstract void doOperation1();
			
			protected abstract void doOperation2();
			
			protected abstract void doOperation3(){
				//................
			}(已经实现)
		}
		
		//具体模板类
		public class ConcreteClass extends AbstractClass{
			public void doOperation1(){
				System.out.println("doOperation1()");
			}
			
			public void doOperation2(){
				//doOperation3();像这样的调用不要发生
				System.out.println("doOperation2()");
			}
		}
		
	二、一个帐户存储的例子
		//抽象类
		public abstratc class Account{
			protected String accountNumber;
			
			public Account(){
				accountNumber = null;
			}
			
			public Account(String accountNumber){
				this.accountNumber = accountNumber;
			}
			
			//模板方法,计算利息数额
			public final double calculateInterest(){
				double interestRate = doCalculateInterestRate();
				String accountType = doCalculateAccountType();
				double amount = calculateAmount(accountType,accountNumber);
				
				return amount*interestRate; 
			}
			
			//基本方法留给子类实现
			protected abstract String doCalculateAccountType();
			
			protected abstract double doCalculateInterestRate();
			
			//基本方法,已经实现
			public final double calculateAmount(String accountType,double accountNumber){
				//从数据库中取数据
				return 7243.00D;	
			}
		}
		
		//具体子类
		public class MoneyMarketAccount extends Account{
			public String doCalculateAccountType(){
				return "Money Market";
			}
			
			public double doCalculateInterestRate(){
				return 0.045D;
			}
		}
		
		public class CDAccount extends Account{
			public String doCalculateAccountType(){
				return "Certificate of Deposite";
			}
			
			public double doCalculateInterestRate(){
				return 0.065D;
			}
		}
		
		//客户端
		public class Client{
			private static Account acct = null;
			
			public static void main(String args[]){
				acct = new MoneyMarketAccount();
				System.out.println("Interest from Money Market account" + acct.calculateInterest());
				acct = new CDAccount();
				System.out.println("Interest from CD account" + acct.calculateInterest());
			}
		}
分享到:
评论
1 楼 shaozhi_jinni 2011-12-15  
[b][/b][i][/i][u][/u]
引用
引用
[img] [/url][url][flash=200,200][/flash]
[/img]

相关推荐

    第二十一讲:模板方法模式

    在给定的“TemplateMethod”文件中,可能包含了一个关于如何在Java或者其他编程语言中实现模板方法模式的示例代码。这个例子可能会演示如何定义一个抽象类,包含模板方法和抽象方法,以及创建一个或多个子类来定制...

    设计模式专题之(十三)模板模式---设计模式模板模式示例代码(python--c++)

    模板模式是一种行为设计模式,它使你能在不破坏封装性的前提下,定义执行算法的框架,而将一些步骤延迟到子类中。这样,你就能创建一个可复用的框架,将具体步骤留给子类来实现。这个模式的核心思想是抽象类定义了一...

    [浪曦原创]JAVA设计模式.第10讲.模板方法模式.rar

    **模板方法模式(Template Method Pattern)**是一种行为设计模式,它在面向对象编程中扮演着重要角色。在Java中,这种模式允许我们定义一个算法框架,而将具体步骤的实现延迟到子类中。模板方法模式是基于继承的,...

    C#设计模式_设计模式_C#_

    工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第21章 模板方法(template method)模式 182 第22章 状态(state)模式 193 第23章 策略(strategy)模式 204 第24章 命令(command)模式 213 第25章 解释器(interpreter)模式 221 第26章 扩展型模式介绍 236 第27章 装饰...

    Delphi模式编程第一分卷

    第25章 模板方法模式(Template Method) 25.1 模式解说 25.2 结构与用法 25.2.1 模式结构 25.2.2 代码模板 25.2.3 问题讨论 25.3 范例与实践 25.3.1 模板方法在离线数据库系统中的应用 25.3.2 范例小结 第...

    [源代码] 《易学 设计模式》 随书源代码

    第16章 按部就班:模板方法模式 (TemplateMethod) 第17章 风吹草动:观察者模式 (Observer) 第18章 变化多端:状态模式 (State) 第19章 明修栈道,暗度陈仓:策略模式 (Strategy) 第20章 循序渐进:职责链模式 ...

    Delphi模式编程第二分卷

    第25章 模板方法模式(Template Method) 25.1 模式解说 25.2 结构与用法 25.2.1 模式结构 25.2.2 代码模板 25.2.3 问题讨论 25.3 范例与实践 25.3.1 模板方法在离线数据库系统中的应用 25.3.2 范例...

    研磨设计模式(完整带书签).part2.pdf

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式...

    07-使用代理快速接入第三方库(1).html

    模板方法模式( Template Method ) 观察者模式( Observer ) 迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式...

    研磨设计模式(完整带书签).part1.pdf

    第16章 模板方法模式(Template Method) 第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式...

    java设计模式ppt

    模板方法模式 (Template Method Pattern) 模板方法模式是一种行为型模式,它定义了一个操作中的算法骨架,将一些步骤延迟到子类中。模板方法让子类可以重新定义算法的某些步骤,而不改变算法的整体结构。这种模式...

    C#设计模式PDF 电子书

    十、模板方法模式(Template Method) 模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 这些设计模式是软件开发中的宝贵...

    设计模式可复用面向对象软件的基础.zip

    5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 ...

    《设计模式》中文版(23个设计模式的介绍与运用)

    5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 ...

    GOLF设计模式(C++语言版)

    5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被...

    设计模式(.PDF)

    5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 ...

    Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides23种设计模式

    5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 ...

    《国外写的,翻译版本》设计模式

    5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 5.12 1 封装变化 228 5.12.2 对象作为参数 228 5.12.3 通信应该被封装还是被分布 229 ...

Global site tag (gtag.js) - Google Analytics