java 策略模式 模板方法 (Template method) 示例

<pre name="code" class="cpp">package org.rui.pattern;

import junit.framework.TestCase;

/**
 * 分解共同性(Factoring Commonality )
 * 应用“一次且只能有一次” 原则产生最基本的模式,将变化的那部分代码放到方 法里。 这可以用两种方法来表达: 策略模式(Strategy
 * ):运行时刻选择算法 另外,Strategy 模式还可以添加一个“上下文(context)”,这个 context 可以 是一个代理类(surrogate
 * class),用来控制对某个特定 strategy 对象的选择和使 用。
 *
 * @author Administrator
 *
 */
public class StrategyPattern extends TestCase
{
	MinimaSolver solver = new MinimaSolver(new LeastSquares());
	double[] line = { 1.0, 2.0, 1.0, 2.0, -1.0, 3.0, 4.0, 5.0, 4.0 };

	public void test()
	{
		System.out.println(solver.minima(line));
		solver.changeAlgorithm(new Bisection());
		System.out.println(solver.minima(line));
		// System.out.println(Arrays2.toString(solver.minima(line)));
	}

	public static void main(String args[])
	{
		junit.textui.TestRunner.run(StrategyPattern.class);
	}
} // /:~
/**
 * 请注意模板方法(template method)和 strategy 模式的相似性——template method
 * 最显著的特征是它有多个方法需要调用,它是分段的实现某个功能。但是,这 并不是说 strategy 对象就不能有多个方法调用;考虑 Shalloway
 * 给出的的订单处理系 统的例子,每一个 strategy 包含不同的国别信息。 JDK 里 Strategy 模式的例子:comparator
 * objects.
 */



package org.rui.pattern;

import java.util.*;

/**
 * 如果 Java 有模板(template)机制,上面这种(类型安全的)迭代器很容易就可 以返回某一特定类型的对象。但是没有模板机制,就必须得返回
 * generic Objects,或 者为每一种需要遍历的对象都手工添加代码。这里我会使用前一种方法。
 * 另外一个需要在设计时决定的问题是什么时候判定对象的类型。一种方法是以迭 代器遍历的第一个对象的类型(作为迭代器的类型),但是这种方法当容器类根据它
 * 自己的内部算法(比如 hash 表)重新为对象排序时就会有问题,这样同一迭代器的两
 * 次遍历就可能得到不同的结果。安全的做法是在构造迭代器的时候让用户指定迭代器 的类型。 最后的问题是如何构建迭代器。我们不可能重写现有的 Java
 * 类库,它已经包含了 枚举器和迭代器。但是,我们可以用 Decorator 模式简单的创建一个枚举器或者迭代
 * 器的外覆类,产生一个具有我们想要的迭代行为(本例中,指在类型不正确的时候抛 出 RuntimeException
 * 异常)的新对象,而这个新对象跟原来的枚举器或者迭代器有相 同的接口,这样一来,它就可以用在相同的场合(或许你会争论说这实际上是 Proxy
 * 模式,但是从它的目的(intent)来说它更像 Decorator 模式)。
 *
 * @author Administrator
 *
 */
public class TypedIterator implements Iterator
{
	private Iterator imp;
	private Class type;

	public TypedIterator(Iterator it, Class type)
	{
		imp = it;
		this.type = type;
	}

	public boolean hasNext()
	{
		return imp.hasNext();
	}

	public void remove()
	{
		imp.remove();
	}

	public Object next()
	{
		Object obj = imp.next();
		if (!type.isInstance(obj))
			throw new ClassCastException("TypedIterator for type " + type
					+ " encountered type: " + obj.getClass());
		return obj;
	}
} // /:~

package org.rui.pattern;

import junit.framework.*;

/**
 * 应用程序框架使你可以从一个或者一系列类继承下来,进而创建一个新的应用程 序,你可以重用既有类的大多数代码并且按照你自己的需要覆写其中的某些方法,从
 * 而实现应用程序的定制。Template Method 是应用程序框架的一个基本概念,它通常隐
 * 藏在(框架)背后,通过调用基类的一组方法(有些方法你可能已经覆写 (overridden)过了)来驱动应用程序。
 *
 * Template Method 的一个重要特征是:它是在基类里定义的,而且不能够被(派生 类)更改。有时候它是私有方法(private
 * method),但实际上它经常被声明为 final。它通过调用其它的基类方法(覆写过的)来工作,但它经常是作为初始化过程
 * 的一部分被调用的,这样就没必要让客户端程序员能够直接调用它了。
 *
 * @author Administrator
 *
 */
abstract class ApplicationFramework
{
	public ApplicationFramework()
	{
		templateMethod(); // 危险的

	}

	abstract void customize1();

	abstract void customize2();

	final void templateMethod()
	{
		for (int i = 0; i < 5; i++)
		{
			customize1();
			customize2();
		}
	}
}

// Create a new "application":
class MyApp extends ApplicationFramework
{
	void customize1()
	{
		System.out.print("Hello ");
	}

	void customize2()
	{
		System.out.println("World!");
	}
}

public class TemplateMethod extends TestCase
{
	MyApp app = new MyApp();

	public void test()
	{// The MyApp constructor does all the work.
		// This just makes sure it will complete
		// without throwing an exception.
	}

	public static void main(String args[])
	{
		junit.textui.TestRunner.run(TemplateMethod.class);
	}
} // /:~
时间: 2024-10-09 19:30:49

java 策略模式 模板方法 (Template method) 示例的相关文章

行为型设计模式之模板方法(TEMPLATE METHOD)模式 ,策略(Strategy )模式

1 模板方法(TEMPLATE METHOD)模式: 模板方法模式把我们不知道具体实现的步聚封装成抽象方法,提供一些按正确顺序调用它们的具体方法(这些具体方法统称为模板方法),这样构成一个抽象基类.子类通过继承这个抽象基类去实现各个步聚的抽象方法,而工作流程却由父类来控制. 2 模板方法应用于下列情况: 1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现. 2)各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复.首先识别现有代码中的不同之处,并且将不同之处分离为新

Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)

(一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开发和维护,所有Java中的类是只能单继承,通过接口来实现多继承:对于接口的话,是可以多继承的,例如:A接口可以同时继承接口B和接口C,但是有一点要注意,就是实现接口A的类必须要实现接口A.B.C中所有的抽象方法:接口之所以可以多继承,就是因为接口结构比较简单. 继承是通过extends关键字来实现,

一天一个设计模式——模板方法(Template Method)模式

一.模式说明 现实世界中的模板是用于将事物的结构规律予以固定化.标准化的成果,它体现了结构形式的标准化.例如镂空文字印刷的模板,通过某个模板印刷出来的文字字体大小都是一模一样,但是具体使用什么材质的颜料,什么颜色的颜料来印刷文字,取决于具体实际业务场景的需要.由此可见,模板制定了某些固定的条条框框,以及事物的处理标准流程,但是并没有说明如何去做,具体如何做,取决于使用模板的人. 在程序设计领域,模板是具有一系列抽象方法的接口类,单看接口类,我们只能知道这个模板有哪些抽象方法以及这些方法的调用顺序

Android与设计模式——模板方法(Template Method)模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意. 模板方法模式的结构 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作

第 9 章 模板方法模式【Template Method Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 周三,9:00,我刚刚坐到位置,打开电脑准备开始干活. “小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了, “告诉大家一个好消息,昨天终于把牛叉模型公司的口子打开了,要我们做悍马模型,虽然是第一个车辆模型,但是我们有能力,有信心做好,我们一定要…(中间省略20 分钟的讲话,如果你听过领导人的讲话,这个你应该能够续上)” 动员工作做完了,那就开始压任务了, “这次时间是非常紧张的

深入浅出设计模式——模板方法模式(Template Method Pattern)

模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意.模板方法模式体现了面向对象的诸多重要思想,是一种使用频率较高的模式. 模式定义模

C#设计模式之十三模板方法模式(Template Method Pattern)【行为型】

原文:C#设计模式之十三模板方法模式(Template Method Pattern)[行为型] 一.引言 "结构型"的设计模式已经写完了,从今天我们开始讲"行为型"设计模式.现在我们开始讲[行为型]设计模式的第一个模式,该模式是[模板方法],英文名称是:Template Method Pattern.还是老套路,先从名字上来看看."模板方法"我第一次看到这个名称,我的理解是,有一个方法的名字叫"模板方法",后来深入学习之后,

C++设计模式之组件协作模式:Template Method、Strategy、Observer

“组件协作”模式: #现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式. #典型模式: Template Method. Strategy. Observer / Event part 1  Template Method 模版模式 动机(Motivation) #在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间

Java 策略模式

Java 策略模式 @author ixenos 定义 1.封装算法:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换 2.分割行为和环境:对用户屏蔽内部实现,使客户端在调用算法的时候能够互不影响地互换 策略模式的实现(面向接口编程) 方法: 1.接口多态:策略模式的用意是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使他们之间可以相互替换 2.具体策略提供不同算法,环境负责维持和查询策略,把具体策略和环境分割开来,使得算法可以在不影响客户端和环境的情况下修改 角色分工: