设计模式模板方法模式JAVA

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设计模式模板方法模式JAVA 篇一:Java模板方法设计模式
1. 什么是回调函数
所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。

回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。

回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。

一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。

由于S并不知道C 提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。

Web Service以及Java 的RMI都用到回调机制,可以访问远程服务器程序。

回调函数包含下面几个特性:
1、属于工作流的一个部分;
2、必须按照工作流指定的调用约定来申明(定义);
3、他的调用时机由工作流决定,回调函数的实现者不能直接调用回调函数来实现工作流的功能;
2. 回调机制
回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。

java回调机制:
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。

同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;
回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;
异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。

回调和异步调用的关系非常紧密:使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

实例:
1、回调类接口
/**
* 回调类接口
*
*/
public interface CallBack {
public String findCallBack();
}
2、调用者
/**
* 调用者
*
*/
public class AnotherFunction {
CallBack findCallBack;
// 调用实现类方法
} public String doCallback() { return
findCallBack.findCallBack(); } /* 业务需要的时候,通过委派,来调用实现类的具体方法 */ public void setCallback(CallBack findCallBack)
{ this.findCallBack = findCallBack; }
3、测试回调函数
/**
* new CallBack给调用者anotherFunction对象传递了一个实现CallBack接口的匿名类,
* 这样AnotherFunction类的对象就取得了一个实现接口的类,可以在任何时候调用接口中的方法
*/
public class CallMainTest {
public static void main(String[] args) {
// 创建调用者实现类 AnotherFunction anotherFunction = new AnotherFunction(); // 将回调类接口注册进实现类中
anotherFunction.setCallback(new CallBack()
{ @Override public String findCallBack()
{
return "在CallMainTest类中实现但不能被CallMainTest 的对象引用,而由AnotherFunction对象调用";
}
});
}//接收回调函数返回的信息 String info = anotherFunction.doCallback(); //打印输出
System.out.println(info); }
上述的代码:
1.两个类:匿名类和AnotherFunction
2.匿名类实现接口CallBack(在CallMainTest测试的main方法中用匿名类的形式实现)
3.AnotherFunction拥有一个参数为CallBack接口类型的函数setCallback(CallBack findCallBack)
4.匿名类运行时调用AnotherFunction 中setCallBack函数,以自身传入参数
5.AnotherFunction 已取得匿名类,就可以随时回调匿名类中所实现的CallBack接口中的方法
回调方法的使用通常发生在“java接口”和“抽象类”的使用过程中。

模板方法设计模式就使用方法回调的机制,该模式首先定义特定的步骤的算法骨架,而将一些步骤延迟到子
类中去实现的设计模式。

模板方法设计模式使得子类可以不
改变一个算法的结构即可重新定义该算法的某些特定步骤。

模板方法设计模式适用性:
1、一次性实现一个算法的不变部分,并将可变的算法留给子
类来实现。

2、各子类中公共的行为应该被提取出来并集中一个公共父类
中以避免代码重复。

3、可以控制子类扩展。

设计实例:
1.AbstractClass
定义抽象的原语操作,具体的子类将重定义它们以实现一个
算法的各步骤。

实现一个模板方法,定义一个算法骨架。

该模板方法不仅调用原语操作,也调用定义在AbstractClass 或其他对象中的操作。

/**
* 抽象模板方法类
*
*/
public abstract class CallBackAbstract {
//需要到子类中实现的方法 public abstract void print(); //模板方法 public void update() { }
} System.out.println("模板中的方法"); for (int i = 0;
i < 3; i++) { print(); }
2.ConcreteClass
实现原语操作以完成算法中与特定子类相关的步骤。

/**
* 具体子类实现继承模板方法类
*
*/
public class CallBackConcrete extends CallBackAbstract {
@Override
public void print() {
} } System.out.println("子类中具体实现的方法被调用");
3.测试类
public class CallTemplateMainTest {
public static void main(String[] args) {
CallBackConcrete cbc=new CallBackConcrete();
}//调用子类中实现的具体方法 cbc.print(); //调用模板方法中的实现方法 cbc.update(); }
4.输出结果:
子类中具体实现的方法被调用
模板中的方法
子类中具体实现的方法被调用
子类中具体实现的方法被调用
子类中具体实现的方法被调用
篇二:JAVA常用设计模式详解大全
Java常用设计模式
目录
设计模
式 .................................................. ..................................................... .. (2)
创建模
式 .................................................. ..................................................... .. (2)
设计模式之Factory -工厂模
式 .................................................. .. (2)
设计模式之FACTORY METHOD -工厂方法模
式 .................................................. .. (2)
设计模式之Builder -建造模
式 .................................................. .. (4)
设计模式之PROTOTYPE -原始模型模
式 .................................................. . (5)
设计模式之Singleton -单例模
式 .................................................. .. (6)
结构模
式 .................................................. ..................................................... .. (7)
设计模式之Adapter -适配
器 .................................................. .. (7)
设计模式之Bridge -桥梁模
式 .................................................. . (8)
设计模式之Composite -合成模
式 .................................................. (9)
设计模式之DECORATOR -装饰模
式 .................................................. (10)
设计模式之Facade -门面模
式 .................................................. . (12)
式 .................................................. . (13)
设计模式之PROXY -代理模
式 .................................................. .. (14)
行为模
式 .................................................. ..................................................... (15)
设计模式之Chain of Responsibility -职责
链 .................................................. . (15)
设计模式之COMMAND - 命令模
式 .................................................. . (16)
设计模式之INTERPRETER -解释器模
式 .................................................. . (17)
设计模式之ITERATOR -迭代子模
式 .................................................. (18)
设计模式之MEDIATOR -调停者模
式 .................................................. .. (19)
式 .................................................. (20)
设计模式之OBSERVER -观察者模
式 .................................................. .. (21)
设计模式之STATE -状态模
式 .................................................. . (23)
设计模式之STRATEGY-策略模
式 .................................................. .. (24)
设计模式之TEMPLATE METHOD-模板方法模
式 .................................................. . (25)
设计模式之VISITOR -访问者模式................................................... . (26)
设计模式
分类
创建模式
结构模式
行为模式
优点
面向界面编程
降低耦合性
增加灵活性
创建模式
设计模式之Factory -工厂模式
客户类和工厂类分开。

消费者任何时候需要某种产品,只需向工厂请求即可。

消费者无须修改就可以接纳新产品。

缺点是当产品修改时,工厂类也要做相应的修改。

设计模式之FACTORY METHOD -工厂方法模式
追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM 爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。

麦当劳和肯德基就是生产鸡翅的Factory
public class Factory{
public static Sample creator(int which){
//getClass 产生Sample 一般可使用动态类装载装入类。

if (which==1)
return new SampleA();
else if (which==2)
return new SampleB();
}
核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。

请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。

public abstract class Factory{
public abstract Sample creator();
public abstract Sample2 creator(String name);
}
public class SimpleFactory extends Factory{
public Sample creator(){
.........
return new SampleA
}
public Sample2 creator(String name){
.........
return new Sample2A
}
}
public class BombFactory extends Factory{
public Sample creator(){
......
return new SampleB
}
public Sample2 creator(String name){
......
return new Sample2B
}
设计模式之Builder -建造模式
将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。

建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。

建造模式可以强制实行一种分步骤进行的建造过程。

MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。

(这一定比美军在伊拉克用的翻译机好卖)
public interface Builder {
//创建部件A 比如创建汽车车轮
void buildPartA();
//创建部件B 比如创建汽车方向盘
void buildPartB();
//创建部件C 比如创建汽车发动机
void buildPartC();
//返回最后组装成品结果 (返回最后装配好的汽车)
//成品的组装过程不在这里进行,而是转移到下面的Director 类别中进行。

//从而实现了解耦过程和部件
Product getResult(); }
public class Director {
private Builder builder;
public Director( Builder builder ) {
this。

builder = builder;
}
// 将部件partA partB partC最后组成复杂对象
//这里是将车轮方向盘和发动机组装成汽车的过程
public void construct() {
builder.buildPartA();
builder.buildPartB();
builder.buildPartC();
}
}
设计模式之PROTOTYPE -原始模型模式
通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。

原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。

缺点是每一个类都必须配备一个克隆方法。

跟MM 用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。

(100块钱一份,你要不要)
public abstract class AbstractSpoon implements Cloneable
{
String spoonName;
public void setSpoonName(String spoonName)
{this.spoonName = spoonName;}public String getSpoonName() {return this.spoonName;}
public Object clone()
{
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException exception) {
System.err.println("AbstractSpoon is not Cloneable");
}
return object;
篇三:设计模式之模板方法模式
设计模式之模板方法模式
Template Method
定义一个操作中的算法骨架,而将一些步骤延伸到子类中去,使得子类可以重新定义算法的特定步骤,但不能改变算法的结构。

使用场合:
1)一次性实现一个算法的不变部分,并且将可变的行为留给子类来完成
2)各子类公共的行为应该被提取出来并集中到一个公共父类中以避免代码的
重复。

首先识别现有代码的不同之处,并且把不同的部分分离为新的操作,最后,用一个调用这些新的操作的模板方法来替换这些不同的代码
3)控制子类的扩展
代码结构:(主要用抽象类)
1) AbstractClass 实现一个模板方法,定义一个算法的骨架
2) ConcreteClass 实现AbstractClass中算法骨架
代码实现:
AbstractClass.java
ConcreteClass.java
TestMain.java
运行结果:
Junit3.8中模板方法模式应用:
TestCase.java中:
每一个case都是先执行setup(),再执行runTest(),最后执行tearDown()。

相关文档
最新文档