- 浏览: 87465 次
- 性别:
- 来自: 龙城
最新评论
-
Fis:
阿呆jinsss 写道 楼主说的简单易懂,最适合我这些理解能力 ...
[原创]AS3.0的自定义事件 -
阿呆jinsss:
楼主说的简单易懂,最适合我这些理解能力差点的人,谢谢了~
[原创]AS3.0的自定义事件 -
Fis:
mengxiaolongcz 写道外层循环 i<arr. ...
去除数组中相同的元素 -
Fis:
mengxiaolongcz 写道外层循环 i<arr. ...
去除数组中相同的元素 -
mengxiaolongcz:
外层循环 i<arr.length-1
里层循环 var ...
去除数组中相同的元素
您从图书馆的期刊从发现了几篇您感兴趣的文章,由于这是图书馆的书,您不可以直接在书中作记号或写字,所以您将当中您所感兴趣的几个主题影印出来,这下子您就可在影印的文章上画记重点。
Prototype模式的作用有些类似上面的描述,您在父类别中定义一个clone()方法,而在子类别中重新定义它,当客户端对于所产生的物件有兴趣并想加以利用,而您又不想破坏原来的物件,您可以产生一个物件的复本给它。
Prototype具有展示的意味,就像是展览会上的原型车款,当您对某个车款感兴趣时,您可以购买相同款示的车,而不是车展上的车。
在软体设计上的例子会更清楚的说明为何要进行物件复制,假设您要设计一个室内设计软体,软体中有一个展示家具的工具列,您只要点选工具列就可以产生一个家具复本,例如一张椅子或桌子,您可以拖曳这个复制的物件至设计图中,随时改变它的位置、颜色等等,当您改变设计图中的物件时,工具列上的原型工具列是不会跟着一起改变的,这个道理是无需解释的。
下面的 UML 类别图表示了上述的简单概念:
protoType-1.jpg
Prototype模式的重点在于clone(),它负责复制物件本身并传回,但这个clone()本身在实作上存在一些困难,尤其是当物件本身又继承另一个物件时,如何确保复制的物件完整无误,在不同的程式语言中有不同的作法。
在Java中的作法是透过实作一个Cloneable介面,它只是一个声明的介面,并无规定任何实作的方法,您的目的是改写Object的clone ()方法,使其具备有复制物件的功能,这个方面建议您参考:How to avoid traps and correctly override methods from java.lang.Object。
用一个简单的例子来实作上图中的结构,这个例子利用了Java语言本身的clone特性:
AbstractFurniture.java
CircleTable与SquareTable继承了AbstractFurniture,并实作clone方法,用于传回本身的复制品:
CircleTable.java
SquareTable.java
House是个虚拟的房屋物件,从Prototype复制出来的物件加入至House中:
House.java
再来是应用程式本身:
Application.java
Java中的clone()方法是继承自Object,AbstractFurniture的子类别则override这个clone()方法,以复制其本身并传回。
下图为Prototype模式的类别结构图:
protoType-2.jpg
在 Gof 的设计模式书中给出一个原型模式的应用:一个通用的图型编辑器 Framework。在这个 Framework中有一个工具列,您可以在上面选择音乐符号以加入乐谱中,并可以随时调整音乐符号的位置等等。
图型编辑器Framework是通用的,然而它并不知道这些音乐符号的型态,有人或许会想到继承图型编辑器Framework来为每个音乐符号设计一个框架子类别,但由于音乐符号的种类很多,这会产生相当多的子类别,为了避免这种情况,可以透过Prototype模式来减少子类别的数目,可以设计出以下的结构:
protoType-3.jpg
依照这个结构,图型编辑器的Framework可以独立于要套用的特定类别之外,虽然不知道被复制传回的对象型态是什么,但总可以按照 Graphics所定义的介面来操作这些物件。
我的小结:个人认为Prototype模式的核心在于对象的克隆方法,为对象添加了这样一个方法,能轻松的实现各种用户的试体验功能。
Prototype模式的作用有些类似上面的描述,您在父类别中定义一个clone()方法,而在子类别中重新定义它,当客户端对于所产生的物件有兴趣并想加以利用,而您又不想破坏原来的物件,您可以产生一个物件的复本给它。
Prototype具有展示的意味,就像是展览会上的原型车款,当您对某个车款感兴趣时,您可以购买相同款示的车,而不是车展上的车。
在软体设计上的例子会更清楚的说明为何要进行物件复制,假设您要设计一个室内设计软体,软体中有一个展示家具的工具列,您只要点选工具列就可以产生一个家具复本,例如一张椅子或桌子,您可以拖曳这个复制的物件至设计图中,随时改变它的位置、颜色等等,当您改变设计图中的物件时,工具列上的原型工具列是不会跟着一起改变的,这个道理是无需解释的。
下面的 UML 类别图表示了上述的简单概念:
protoType-1.jpg
Prototype模式的重点在于clone(),它负责复制物件本身并传回,但这个clone()本身在实作上存在一些困难,尤其是当物件本身又继承另一个物件时,如何确保复制的物件完整无误,在不同的程式语言中有不同的作法。
在Java中的作法是透过实作一个Cloneable介面,它只是一个声明的介面,并无规定任何实作的方法,您的目的是改写Object的clone ()方法,使其具备有复制物件的功能,这个方面建议您参考:How to avoid traps and correctly override methods from java.lang.Object。
用一个简单的例子来实作上图中的结构,这个例子利用了Java语言本身的clone特性:
AbstractFurniture.java
public abstract class AbstractFurniture implements Cloneable { public abstract void draw(); // 在Design Pattern上,以下的clone是抽象未实作的 // 实际上在Java中class都继承自Object // 所以在这边我们直接重新定义clone() // 这是为了符合Java现行的clone机制 protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
CircleTable与SquareTable继承了AbstractFurniture,并实作clone方法,用于传回本身的复制品:
CircleTable.java
import java.awt.*;public class CircleTable extends AbstractFurniture { protected Point center; public void setCenter(Point center) { this.center = center; } protected Object clone () throws CloneNotSupportedException { Object o = super.clone(); if(this.center != null) { ((CircleTable) o).center = (Point) center.clone(); } return o; } public void draw() { System.out.println("\t圆桌\t中心:(" + center.getX() + ", " + center.getY()+ ")"); } }
SquareTable.java
import java.awt.*;public class SquareTable extends AbstractFurniture { protected Rectangle rectangle; public void setRectangle(Rectangle rectangle) { this.rectangle = rectangle; } protected Object clone () throws CloneNotSupportedException { Object o = super.clone(); if(this.rectangle != null) { ((SquareTable) o).rectangle = (Rectangle) rectangle.clone(); } return o; } public void draw() { System.out.print("\t方桌\t位置:(" + rectangle.getX() + ", " + rectangle.getY()+ ")"); System.out.println(" / 宽高:(" + rectangle.getWidth() + ", " + rectangle.getHeight()+ ")"); } }
House是个虚拟的房屋物件,从Prototype复制出来的物件加入至House中:
House.java
import java.util.*; public class House { private Vector vector; public House() { vector = new Vector(); } public void addFurniture(AbstractFurniture furniture) { vector.addElement(furniture); System.out.println("现有家具...."); Enumeration enumeration = vector.elements(); while(enumeration.hasMoreElements()) { AbstractFurniture f = (AbstractFurniture) enumeration.nextElement(); f.draw(); } System.out.println(); } }
再来是应用程式本身:
Application.java
import java.awt.*;public class Application { private AbstractFurniture circleTablePrototype; public void setCircleTablePrototype( AbstractFurniture circleTablePrototype) { this.circleTablePrototype = circleTablePrototype; } public void runAppExample() throws Exception { House house = new House(); CircleTable circleTable = null; // 从工具列选择一个家具加入房子中 circleTable = (CircleTable) circleTablePrototype.clone(); circleTable.setCenter(new Point(10, 10)); house.addFurniture(circleTable); // 从工具列选择一个家具加入房子中 circleTable = (CircleTable) circleTablePrototype.clone(); circleTable.setCenter(new Point(20, 30)); house.addFurniture(circleTable); } public static void main(String[] args) throws Exception { Application application = new Application(); application.setCircleTablePrototype( new CircleTable()); application.runAppExample(); } }
Java中的clone()方法是继承自Object,AbstractFurniture的子类别则override这个clone()方法,以复制其本身并传回。
下图为Prototype模式的类别结构图:
protoType-2.jpg
在 Gof 的设计模式书中给出一个原型模式的应用:一个通用的图型编辑器 Framework。在这个 Framework中有一个工具列,您可以在上面选择音乐符号以加入乐谱中,并可以随时调整音乐符号的位置等等。
图型编辑器Framework是通用的,然而它并不知道这些音乐符号的型态,有人或许会想到继承图型编辑器Framework来为每个音乐符号设计一个框架子类别,但由于音乐符号的种类很多,这会产生相当多的子类别,为了避免这种情况,可以透过Prototype模式来减少子类别的数目,可以设计出以下的结构:
protoType-3.jpg
依照这个结构,图型编辑器的Framework可以独立于要套用的特定类别之外,虽然不知道被复制传回的对象型态是什么,但总可以按照 Graphics所定义的介面来操作这些物件。
我的小结:个人认为Prototype模式的核心在于对象的克隆方法,为对象添加了这样一个方法,能轻松的实现各种用户的试体验功能。
发表评论
-
我的开发成长日记(1)
2020-02-05 18:11 02018年是个特别的年 ... -
VR开发中用到的技术总结
2017-12-11 14:32 0使用Unity3D开发VR应用有2年了,刚刚接触都朋友和同 ... -
LayaBox flash 转换项目心得
2015-08-28 13:50 4438一、熟悉从as3项目转到js的API和特性差异 1、Simpl ... -
Starling中AssetManager加载文件的流程整理
2015-06-16 20:15 1362Starling做移动开发,会用到大量的纹理和图片素材、X ... -
LayaBox flash 转换项目心得
2015-08-28 13:46 0一、熟悉从as3项目转到j ... -
金武传
2012-12-08 19:28 0丐帮: 萧峰,远,擒龙功,降魔掌,打狗棒法,降龙十八掌* 洪七 ... -
SWFLoader不响应Event.COMPLETE事件
2012-06-25 16:16 1218工作中遇到了一个问题,flex控件SWFLoader解决了 ... -
PHP中的生成XML文件的4种方法
2012-05-02 14:07 1047原文:http://www.oschina.net/code/ ... -
AS3 位运算
2012-04-17 13:04 917原文转至http://www.tangpei.net/2011 ... -
支持参数的事件处理函数
2012-04-11 14:44 3通常情况下,我们使用事件机制时,编写的事件处理函数只需要一 ... -
关于as3运动效果的总结
2012-03-22 18:18 1042看了《ActionScript3.0高级动画教程》一书,用 ... -
ActionScript3高级动画教程笔记
2012-03-14 17:09 8002012.3.14 基本三角函数的计算: 角的正弦值 = ... -
Design Pattern: Adapter 模式 - Class Adapter
2012-03-09 10:42 706Adapter模式的另一种 ... -
Design Pattern: Adapter 模式 - Object Adapter
2012-03-08 16:00 671您的电脑是个旧电脑,新的滑鼠都在使用USB接口了,而您的电 ... -
Design Pattern: Default Adapter 模式
2012-03-08 15:12 990在Java中如果要定义事件处理的方式,必须实作EventL ... -
Design Pattern: Registry of Singleton 模式
2012-03-08 14:23 812考虑使用 Singleton 模式 时拥有子类别的问题,在 ... -
Design Pattern: Singleton 模式
2012-03-08 11:55 824Singleton的英文意义 ... -
Design Pattern: Factory Method 模式
2012-03-07 20:04 759考虑一个状况,您 ... -
Design Pattern: Builder 模式
2012-03-07 19:26 785您想要建立一个迷宫产生程式,迷宫使用二维阵列来定义,0表示 ... -
Design Pattern: Abstract Factory 模式
2012-03-07 18:43 925假设您要制作一个对话方块(Dialog)元件,您希望的是这 ...
相关推荐
DesignPattern项目是设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发...
本资源“DesignPattern::pencil:设计模式_java实现以及详解”提供了一套详细的学习材料,帮助开发者理解和应用设计模式。 该资源的作者是“养码青年-Style”,他通过这个项目记录了自己的设计模式学习过程。鼓励...
DesignPattern-master这个压缩包可能包含了一个关于设计模式的项目或者教程资源。 设计模式分为三类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式(Behavioral Patterns)...
"designPattern:设计模式相关代码实现"这个项目,显然提供了不同设计模式在Java语言中的实际应用示例。 在Java世界里,设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。每种模式都针对特定的编程问题...
这个名为"DesignPattern"的压缩包文件很可能包含了一个Java实现的各种设计模式的示例程序。 在这个"DesignPattern-master"目录中,我们可以期待找到一系列与设计模式相关的Java源代码文件(.java),每个文件或...
23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm”供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) 生成...
designpattern design pattern for java 描述: pattern.p001.factory :工厂模式。 pattern.p002.abstractfactory : 抽象工厂模式。 pattern.p003.singletonEH : 单例模式(饿汉式)。 pattern.p003.singletonLH : ...
"DesignPattern:C#设计模式示例"这个资源很可能是包含多个C#实现的设计模式示例代码库。 设计模式通常分为三类:创建型、结构型和行为型。每种模式都解决了特定场景下的问题,并提供了良好的代码组织和扩展性。 ...
设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的经验总结。...在DesignPattern-master这个压缩包中,你可以找到关于这些模式的详细讲解和实例代码,为你的Java开发之旅提供宝贵的参考资料。
5. 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。它通常用于初始化较大的对象。 6. 适配器模式(Adapter Pattern):将一个类的接口转换为客户期望的另一个...
这个名为"Design-pattern:设计模式"的压缩包可能包含了一个关于设计模式的学习资源,比如代码示例或者教程。 创建型设计模式是设计模式中的一个类别,主要关注对象的创建过程。这类模式包括工厂方法(Factory ...
本资料包“JAVA 23种设计模式(全).Design Pattern_Java模式”涵盖了所有23种经典的GOF(GoF,Gang of Four)设计模式,旨在帮助开发者深入理解和应用这些模式。 首先,我们来看一下23种设计模式的分类: 1. **创建...
本教程的"designpattern-master"可能包含以上各种设计模式的实例代码和详细解释,帮助学习者通过实践掌握这些模式。在实际项目中,灵活运用这些设计模式可以提高代码质量,使项目更加健壮和易于维护。对于PHP开发者...
### Design Pattern(设计模式)讲义 #### 一、引言 设计模式是软件工程领域的一个重要主题,它提供了一套解决常见问题的方案。侯捷老师的讲义为我们揭示了设计模式背后的原理与实践方法。这份讲义不仅包含了GoF...
设计模式(Design Pattern)是软件工程中用于解决软件设计问题的既定方案。设计模式并非直接的代码实现,而是一套被验证过的通用解决方案模板。它们是由经验丰富的软件开发者总结出的,在特定上下文中对常见问题的...
"design-pattern:设计模式学习"这个主题涵盖了许多关键知识点,包括但不限于以下几个方面: 1. **单例模式(Singleton)**:保证一个类只有一个实例,并提供全局访问点。在Java中,可以通过双重检查锁定、静态内部...
本资料库中的"design pattern设计模式范例"提供了23种经典设计模式以及最新的范式用法,非常适合用于项目重构或作为学习设计模式的参考。 首先,我们来看23种经典的设计模式,它们通常分为三类:创建型、结构型和...
"DesignPattern.rar"这个压缩包包含的13种设计模式如下: 1. **适配器模式(Adapter Pattern)**:适配器模式主要用于解决不同接口之间不兼容的问题。通过创建一个适配器类,将原有接口转换为客户期望的接口,使得...
在“阅读java源码-JavaDesignPattern:23种设计模式Java实现”中,我们将深入探讨这23种设计模式的Java实现。 1. **创建型模式**(Creational Patterns): - **单例模式(Singleton)**:确保一个类只有一个实例,...