《原型模式》
- 格式:ppt
- 大小:1.10 MB
- 文档页数:11
科技视界Science&Technology VisionScience&Technology Vision科技视界词汇能力是英语“听、说、读、写、译”五项技能的基础,词汇教学在英语教学中的地位举足轻重。
传统上,教学者未能重视词汇习得的认知因素,对英语词汇的讲解表面、孤立;学习者则对词语的音、形、义进行机械地识记,无法融会贯通,导致学习词汇的热情减弱,甚至产生抵触心理。
为了改变英语词汇教学费时低效的局面,教学者应该以先进的语言学理论为指导,结合自身的教学实践,探索出更具科学性和高效性的词汇教学方法。
作为认知语言学的理论基石,原型范畴理论为英语词汇的研究和教学提供了崭新的视角。
1认知语言学的原型范畴观认知语言学于20世纪七八十年代诞生于欧美,是认知心理学和语言学相结合的新兴学科,处于语言研究的前沿[1]116。
认知语言学认为,人类通过范畴化来认识世界。
范畴化是人类在纷繁复杂的世界中发现相似性,并据此对世间万物进行分类的心理过程,是认知语言学的核心内容,认知范畴是范畴化的产物。
关于范畴的研究由来已久。
以Aristotle为代表的经典范畴观认为,范畴的划分采用二分法,范畴由一组充分必要条件来定义,事物要么具备所有充要特性属于某范畴,要么不属于;范畴的边界清晰;范畴成员地位平等。
1953年,Wittgenstein在其《哲学研究》中通过对“游戏”的研究指出,决定范畴的是家族相似性而非共同特征,并在此基础上论述了范畴边界的模糊性,中心成员与边缘成员的区别以及隶属度的差异。
“家族相似性”原理是对经典范畴理论的挑战和批判,它对范畴的全新阐释启发了原型范畴理论,并成为后者的构建基础。
1969年,Berlin和Kay在比较研究了98种语言的颜色词后指出,颜色的范畴化以“焦点色”为认知参照。
70年代中期,Rosch对焦点色的心理背景进行了研究并发现,颜色范畴中的焦点色在感知上更突显,更易被儿童习得和记忆。
《织工马南》中原型模式的置换原型模式乔治・爱略特是维多利亚时期一位非常出色的哲思家、小说家。
由于受到宗教思想的影响,《圣经》的经典叙事技巧。
为爱略特提供了创作模板,使她在处理创作中的虚幻和现实问题时得心应手。
《织工马南》在处理人物与情节的关系上别具风格。
小说情节模仿了圣经原裂救赎这一传统模式,马南在情节与人物的置换下得到救赎,这也是爱略特人本关怀思想的体现。
小说中情节与人物都有可能成为文章的原动力,而关于人物与情节的最早的权威性的论述可追溯到亚里士多德《诗学》,他认为情节尤为重要,人物性格的塑造只能占第二位。
亚里士多德的主要理由是情节(亦即行动)能够带动人物的刻画,而人物则不能带动情节,只能在行动的时候附带表现性格而已(殷企平,2001:241)。
该小说中作者就充分发挥了情节的调动作用,用置换手法展开叙述。
二、故事情节置换原型情节的置换表现在文本中人物生活环境的改变上。
通过原型情节置换,作者“设计出一种新的现实来代替我们已经继承而且习惯的(并非虚构的)现实”(瞿铁鹏译,1997:61),这样情节置换为丰富人物形象设定了前景,也让读者用一种新奇的眼光去感受事物。
小说的人物无法独立于情节之外,而且人物与情节之间也必须形成不同程度的相互依赖关系。
马南年轻时丝毫不怀疑上帝的仁爱,即使被朋友诬陷,他还是坚信“上帝会相信我的清白”(Eliot,1994,18)。
此情节与圣经中《约伯记》有相似之处即受难开始。
马南在众叛亲离之时勇敢地说没有一个保护善良惩治邪恶的上帝,只有一个说谎的上帝。
这说明他对自己深信不疑的东西产生了怀疑,对灵魂地侮辱使他陷入对生活的恐惧和对信仰的挣扎之中,同时这句话也暗含对旧宗教虚妄性的质疑。
此情节的设置引出下文中对“人本宗教”的渴望,从而原型救赎的出现顺理成章。
马南的金子被盗,使他再次陷入低谷,他就是在这种场合下由所谓的“盗贼”变成了失主。
十五年间马南把自己像机器一样地绑在织布机前,但是织布的工作“从未让他搅入外部世界的社会关系和社会义务之中,只是带来金币的积攒罢了,这表明他的工作所发挥的作用到此为止,或者仅仅是一种工作与金钱之间的简单重复”(李安,2004:45),这种情节带给他孤立封闭的生活环境。
设计模式之原型模式(c++)问题描述看到这个模式,很容易想到⼩时候看的《西游记》,齐天⼤圣孙悟空发飙的时候可以通过⾃⼰头上的 3 根⽑⽴马复制出来成千上万的孙悟空,对付⼩妖怪很管⽤(数量最重要)。
Prototype 模式也正是提供了⾃我复制的功能,就是说新对象的创建可以通过已有对象进⾏创建。
在 C++中,拷贝构造函数( Copy Constructor)曾经是很对程序员的噩梦,浅层拷贝和深层拷贝的魔魇也是很多程序员在⾯试时候的快餐和系统崩溃时候的根源之⼀。
在GOF的《设计模式:可复⽤⾯向对象软件的基础》中是这样说的:⽤原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
这这个定义中,最重要的⼀个词是“拷贝”,也就是⼝头上的复制,⽽这个拷贝,也就是原型模式的精髓所在。
UML类图由于克隆需要⼀个原型,⽽上⾯的类图中Prototype就这个原型,Prototype定义了克隆⾃⾝的Clone接⼝,由派⽣类进⾏实现,⽽实现原型模式的重点就在于这个Clone接⼝的实现。
ConcretePrototype1类和ConcretePrototype2类继承⾃Prototype类,并实现Clone接⼝,实现克隆⾃⾝的操作;同时,在ConcretePrototype1类和ConcretePrototype2类中需要重写默认的复制构造函数,供Clone函数调⽤,Clone就是通过在内部调⽤重写的复制构造函数实现的。
在后续的编码过程中,如果某个类需要实现Clone功能,就只需要继承Prototype类,然后重写⾃⼰的默认复制构造函数就好了。
好⽐在C#中就提供了ICloneable接⼝,当某个类需要实现原型模式时,只需要实现这个接⼝的道理是⼀样的。
使⽤场合原型模式和建造者模式、⼯⼚⽅法模式⼀样,都属于创建型模式的⼀种。
简单的来说,我们使⽤原型模式,就是为了创建对象。
不过,适合原型模式的最好选择如下:1.当我们的对象类型不是开始就能确定的,⽽这个类型是在运⾏期确定的话,那么我们通过这个类型的对象克隆出⼀个新的对象⽐较容易⼀些;2.有的时候,我们需要⼀个对象在某个状态下的副本,此时,我们使⽤原型模式是最好的选择;例如:⼀个对象,经过⼀段处理之后,其内部的状态发⽣了变化;这个时候,我们需要⼀个这个状态的副本,如果直接new⼀个新的对象的话,但是它的状态是不对的,此时,可以使⽤原型模式,将原来的对象拷贝⼀个出来,这个对象就和之前的对象是完全⼀致的了;3.当我们处理⼀些⽐较简单的对象时,并且对象之间的区别很⼩,可能就⼏个属性不同⽽已,那么就可以使⽤原型模式来完成,省去了创建对象时的⿇烦了;4.有的时候,创建对象时,构造函数的参数很多,⽽⾃⼰⼜不完全的知道每个参数的意义,就可以使⽤原型模式来创建⼀个新的对象,不必去理会创建的过程。
面向对象分析与设计—四色原型模式1.背景介绍至今我都清楚的记得我第一次被面试官问起什么叫“建模”技术时的情景,那是好几年前的事情了,当时是胸有成竹的去面试一个有关系统分析、设计的.NET高级软件工程师岗位。
面试官几乎没问我有关.NET方面的任何技术实现,他就简单的问了问:“你如何把握你所分析出来的系统的正确性?”,我当时有点小激动,觉得这个问题应该很简单嘛,都是概念而已,让他直接点问,结果他来一句:“你懂建模吗?,能给我解释一下建模的作用吗?”,接着他出了一个小例子,让我对这个例子进行建模,要考虑到各种扩展性、业务稳定性的关键点,要边建模边说出为什么要这么建模,要说出思路。
他最后重点强调了一下:“创建出来的模型是不允许跟任何具体的代码、工具有关联的”。
在我现在看来,他的意思也就是说创建出来的UML类图模型是领域无关模型(领域通用模型),可以用任何一种编程技术去实现他,作为建模者不需要考虑这些实现细节,考虑的越多越容易分散你对真实业务的等价建模,容易犯技术人员的通病(用技术的思维来考虑业务)。
我当时心想这个容易啊,不就是用UML搞点图出来做做秀嘛,体现出分析、设计的高端嘛,其他还能有啥作用;其实我当时之所以这么想是因为我对UML、建模也尝试过学习、理解和运用,结果我发现这就是一个作秀的工具罢了,对这个东西很不屑,甚至对软件工程中的“建模”领域有一种抵触心理。
我当时随口说了一些我学习UML建模时的心得,心想这个也就是最终答案了,因为它确实就是这个作用(“作秀”),然后我通过代码驱动建模,倒着推导出UML的类图,结果和我意料的差不多;基本上都覆盖了这个小例子的几大方面,反正面试官不知道我是如何得出这个UML类图的,只有天知道,我是通过先构建代码模型然后反方向推到出类图模型的,嘴上说的跟心理想的完全是相反的。
在我感觉非常良好的等着面试官接着问下一个问题的时候,情况出现了。
面试官说我漏掉了东西,说我没有充分考虑到业务场景,没有将业务概念中的关键概念划分清楚,甚至疏忽了很重小的领域实体属性,按照我这个模型图开发出来的软件是不能够满足现在的业务要求的。
原型模式找⼯作难呐 ⼤家好,我原本是神剑⼭庄的铸剑师,名叫⼩赵,本来⼲的好好的,后来⼀时兴起,睡了三少爷的⼩姨⼦,与其⼀直提⼼吊胆,⼲脆来个逃之夭夭。
但是,我也要吃饭的呀,⼯作也得找,神剑⼭庄去不得,还有断剑⼭庄、藏剑⼭庄、荡剑⼭庄、等等等等⼤型企业,说不定这次跳槽,能跳出个飞黄腾达! 为了提⾼我投简历的准确性,我觉得简历要写的多样化,不能全写⼀模⼀样,⽐如说我的期望薪资不能写成⼀样,因为我希望能够根据⽬标企业的情况来投递合适薪资的简历,这样中标概率⼤⼀点。
这是我的简历类:public class Resume {private String name;private String position;private int salary;public String getName() {return name;}public void setName(String name) { = name;}public String getPosition() {return position;}public void setPosition(String position) {this.position = position;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}@Overridepublic String toString() {return "Resume{" +"name='" + name + '\'' +", position='" + position + '\'' +", salary=" + salary +'}';}} 现在,我正在熬夜写简历。
原型模式(PrototypePattern)⼀、什么是原型模式原型模式(Prototype Pattern)也是⼀种创建型模式,它关注的是⼤量相似对象的创建问题。
我们经常会遇到这样的情况:在系统中要创建⼤量的对象,这些对象之间具有⼏乎完全相同的功能,只是在细节上有⼀点⼉差别。
意图⽤原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
结构图原型模式的基本实现原型类:1public abstract class Prototype2 {3private int id;45public Prototype(int id)6 {7this.id = id;8 }910public int Id11 {12get { return id; }13 }1415public abstract Prototype Clone();16 }具体的原型类:1public class ConcretePrototype : Prototype2 {3public ConcretePrototype(int id) : base(id) { }45public override Prototype Clone()6 {7return (Prototype)this.MemberwiseClone();8 }9 }客户端代码:1public class Client2 {3public static void Main(string[] args)4 {5 ConcretePrototype cp1 = new ConcretePrototype(1);6 ConcretePrototype cp2 = cp1.Clone() as ConcretePrototype;78 Console.WriteLine(cp1.Id);9 Console.WriteLine(cp2.Id);1011 Console.Read();12 }13 }对于.NET⽽⾔,那个原型抽象类Prototype是⽤不着的,因为克隆实在是太常⽤了,所以.NET在System命名空间中提供了ICloneable接⼝,其中就是唯⼀的⼀个⽅法Clone(),这样你就只需要实现这个接⼝就可以完成原型模式了。
C#设计模式系列:原型模式(Prototype)1、原型模式简介1.1>、定义 原型模式(Prototype)⽤原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
1.2>、使⽤频率 中1.3>、原型模式应⽤ ⾸先从实际⽣活来了解原型模式的由来,假设你有⼀份⾮常好的讲义,你的朋友也想要⼀份,那么怎么办?重新⼿抄⼀份?显然不是,当然是⽤复印机复印⼀份来得⽅便、直接,并且准确性也⾼,这种⽤原型来复制⽽不是重新创建的思维⽅式就是原型模式的核⼼思想。
Prototype Pattern也是⼀种创建型模式,它关注的是⼤量相同或相似对象的创建问题。
应⽤原型模式就是建⽴⼀个原型,然后通过对原型来进⾏复制的⽅法,来产⽣⼀个和原型相同或相似的新对象,或者说⽤原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
2、原型模式结构2.1>、结构图2.2>、参与者 原型模式参与者: ◊ Prototype:原型类,声明⼀个Clone⾃⾝的接⼝; ◊ ConcretePrototype:具体原型类,实现⼀个Clone⾃⾝的操作。
在原型模式中,Prototype通常提供⼀个包含Clone⽅法的接⼝,具体的原型ConcretePrototype使⽤Clone⽅法完成对象的创建。
3、原型模式结构实现 Prototype.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.PrototypePattern.Structural{///<summary>/// The 'Prototype' abstract class///</summary>public abstract class Prototype{private string _id;///<summary>/// Constructor///</summary>public Prototype(string id){this._id = id;}///<summary>/// Gets id///</summary>public string Id{get { return _id; }}public abstract Prototype Clone();}} ConcretePrototype1.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.PrototypePattern.Structural{public class ConcretePrototype1 : Prototype{///<summary>/// Constructor///</summary>public ConcretePrototype1(string id): base(id){}///<summary>/// Returns a shallow copy///</summary>///<returns></returns>public override Prototype Clone(){return (Prototype)this.MemberwiseClone();}}} ConcretePrototype2.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.PrototypePattern.Structural{public class ConcretePrototype2 : Prototype{///<summary>/// Constructor///</summary>public ConcretePrototype2(string id): base(id){}///<summary>/// Returns a shallow copy///</summary>///<returns></returns>public override Prototype Clone(){return (Prototype)this.MemberwiseClone();}}} Client.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using DesignPatterns.PrototypePattern.Structural; namespace DesignPatterns.PrototypePattern{class Client{static void Main(string[] args){// Create two instances and clone eachConcretePrototype1 p1 = new ConcretePrototype1("I"); ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone(); Console.WriteLine("Cloned: {0}", c1.Id);ConcretePrototype2 p2 = new ConcretePrototype2("II"); ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone(); Console.WriteLine("Cloned: {0}", c2.Id);}}} 运⾏输出:Cloned: ICloned: II请按任意键继续. . .4、原型模式实践应⽤ ColorPrototype.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.PrototypePattern.Practical{///<summary>/// The 'Prototype' abstract class///</summary>public abstract class ColorPrototype{public abstract ColorPrototype Clone();}} Color.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.PrototypePattern.Practical{///<summary>/// The 'ConcretePrototype' class///</summary>public class Color : ColorPrototype{private int _red;private int _green;private int _blue;///<summary>/// Constructor///</summary>public Color(int red, int green, int blue){this._red = red;this._green = green;this._blue = blue;}///<summary>/// Create a shallow copy///</summary>public override ColorPrototype Clone(){Console.WriteLine("Cloning color RGB: {0,3},{1,3},{2,3}", _red, _green, _blue);return this.MemberwiseClone() as ColorPrototype;}}} ColorManager.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace DesignPatterns.PrototypePattern.Practical{///<summary>/// Prototype manager///</summary>public class ColorManager{private Dictionary<string, ColorPrototype> _colors = new Dictionary<string, ColorPrototype>();///<summary>/// Indexer///</summary>public ColorPrototype this[string key]{get { return _colors[key]; }set { _colors.Add(key, value); }}}} Client.csusing System;using System.Collections.Generic;using System.Linq;using System.Text;using DesignPatterns.PrototypePattern.Practical;namespace DesignPatterns.PrototypePattern{class Client{static void Main(string[] args){ColorManager colormanager = new ColorManager();// Initialize with standard colorscolormanager["red"] = new Color(255, 0, 0);colormanager["green"] = new Color(0, 255, 0);colormanager["blue"] = new Color(0, 0, 255);// User adds personalized colorscolormanager["angry"] = new Color(255, 54, 0);colormanager["peace"] = new Color(128, 211, 128);colormanager["flame"] = new Color(211, 34, 20);// User clones selected colorsColor color1 = colormanager["red"].Clone() as Color;Color color2 = colormanager["peace"].Clone() as Color;Color color3 = colormanager["flame"].Clone() as Color;}}} 运⾏输出:Cloning color RGB: 255, 0, 0Cloning color RGB: 128,211,128Cloning color RGB: 211, 34, 20请按任意键继续. . .5、原型模式应⽤分析 原型模式可以适⽤于以下情形: ◊ 当⼀个系统应该独⽴于它的产品创建、构成和表⽰时; ◊ 当要实例化的类是在运⾏时刻指定时,例如通过动态装载来创建⼀个类; ◊ 为了避免创建⼀个与产品类层次平⾏的⼯⼚类层次时; ◊ 当⼀个类的实例只能有⼏个不同状态组合中的⼀种时。