设计模式之我见
设计模式实践心得体会

自从接触软件开发以来,我一直在追求更高的编程技艺。
在这个过程中,设计模式成为了我不可或缺的工具。
设计模式不仅能够提高代码的可读性和可维护性,还能降低代码的耦合度,使系统更加灵活。
以下是我在实践设计模式过程中的一些心得体会。
一、设计模式的起源与作用设计模式最早由著名的软件工程专家Gamma等人提出,它是一套经过实践检验、可重用的软件设计经验。
设计模式的作用主要体现在以下几个方面:1. 提高代码可读性和可维护性:设计模式使代码结构更加清晰,易于理解,方便后续的维护和修改。
2. 降低代码耦合度:设计模式强调模块化设计,将不同的功能封装在独立的模块中,降低了模块之间的依赖关系。
3. 增强系统灵活性:设计模式使系统更加模块化,便于扩展和重构,提高了系统的灵活性。
4. 提高编程效率:设计模式可以复用现有的设计经验,减少重复劳动,提高编程效率。
二、设计模式的分类与特点设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。
1. 创建型模式:创建型模式关注对象的创建过程,主要解决对象创建过程中产生的问题。
常见的创建型模式有:工厂方法模式、抽象工厂模式、单例模式、建造者模式等。
2. 结构型模式:结构型模式关注类与类之间的关系,主要解决类与类之间的组合和继承问题。
常见的结构型模式有:适配器模式、装饰者模式、代理模式、桥接模式等。
3. 行为型模式:行为型模式关注对象之间的交互,主要解决对象之间的协作和职责分配问题。
常见的行为型模式有:观察者模式、策略模式、模板方法模式、责任链模式等。
三、设计模式在实践中的应用1. 工厂方法模式:在项目中,我们常常需要根据不同的业务需求创建不同的对象。
使用工厂方法模式,可以将对象的创建过程封装在独立的工厂类中,降低对象的创建复杂度。
2. 单例模式:在项目中,有些资源(如数据库连接、文件读写等)是全局共享的。
使用单例模式,可以确保这类资源在系统中只有一个实例,避免资源浪费。
3. 适配器模式:在项目中,我们可能会遇到一些接口不兼容的情况。
工业设计之我见,浅谈设计的继承与创新(5篇)

工业设计之我见,浅谈设计的继承与创新(5篇)第一篇:工业设计之我见,浅谈设计的继承与创新工业设计之我见浅谈设计的继承与创新专业班级:工业设计二班学号:***********姓名:卢伟二〇一〇年十二月工业设计之我见——浅谈设计的继承与创新卢伟(潍坊学院 261061)摘要:传统文化符号作为民族文化的重要组成部分,通过对其在产品设计中的应用,说明在现代的产品设计中,如何进一步发掘、运用这笔财富,使传统文化符号和现代产品设计达到形式、蕴涵上的完美融合。
在丰富产品造型形态,提高产品内涵价值的同时,更是对传统文化的传播与发扬。
通过现有产品浅析设计的发展趋势之一:智能。
关键词:设计传统文化元素创新智能My Industrial DesignNameluweiUnitweifang universityAbstract :The traditional cultural symbol is an important part of the national culture.The ways to explore and use this treasure was discussed with example of product design.The amalgamation of traditional cultural symbol with modern product design both in form and contain was analyzed.The purpose was to provide reference for product design to enrich product modeling, to increase the connotation value of product, and to spread traditional culture.Through the existing product to analysis one of the trends of design development: intelligent..Keywords:design/traditional cultural symbol/innovation/intelligent 我,2008年挤过了高考的独木桥,带着些许的迷茫选择了自己并不熟悉的专业——工业设计。
《设计模式》读后感

《设计模式》读后感
《设计模式》是一本经典的计算机科学书籍,被誉为软件开发领域的“圣经”。
在阅读完这本书后,我深深感受到了设计模式的重要性和价值,同时也对自己的编程能力有了更深的认识和理解。
首先,设计模式作为一种通用的解决方案,可以帮助我们更好地理解和应用面
向对象编程的原则。
通过学习各种设计模式,我们可以更加灵活地设计和实现软件系统,提高代码的可维护性和可扩展性。
例如,单例模式可以确保一个类只有一个实例,保证全局唯一性;观察者模式可以实现对象之间的解耦,提高系统的灵活性。
其次,设计模式也是一种思维方式和编程习惯的培养。
在实践中,我们往往会
遇到各种各样的问题和挑战,而设计模式可以帮助我们更好地理清问题的本质,找到合适的解决方案。
通过不断地应用设计模式,我们可以提高自己的编程水平和思维能力,更好地应对复杂的软件开发任务。
另外,设计模式还可以帮助我们更好地与他人合作,提高团队的协作效率和代
码质量。
在团队开发中,大家都遵循相同的设计模式和编程规范,可以更加容易地理解和维护彼此的代码。
设计模式的统一性和规范性可以有效地减少代码冲突和bug,提高团队的整体效率和质量。
总的来说,阅读《设计模式》这本书给我带来了很多启发和收获。
通过学习和
应用设计模式,我不仅提高了自己的编程技能,还培养了解决问题的思维方式和团队合作的意识。
我相信,在今后的软件开发工作中,设计模式将会成为我不可或缺的利器,帮助我更好地应对各种挑战和机遇。
设计模式不仅是一种技术,更是一种智慧和经验的积累,让我们一起努力,不断学习和提高,创造更加优秀的软件作品。
设计模式学习心得

设计模式学习⼼得学习到现在的主要问题是没有进⾏例⼦的完美历练,说⽩了,就是没动⼿亲⾃的试试,写写对应的代码,理解⼀下主要的设计思想,这个应该是学习设计模式我最重要的地⽅,那么现在针对之前学习的设计模式做⼀个总结和回顾吧0.设计模式分析规律在讲解这个设计模式之前,我们应该学习到设计的原则,1.分析程序中变化的位置,针对变化的位置进⾏封装隔离分析是对鸭⼦的叫声和会飞进⾏了特殊的隔离,因为这两种⾏为是特殊于其他普通鸭⼦的⾏为,这⾥考虑的就是封装这个变化第⼀种⾓度:我们考虑之前的⾏为都是采⽤继承的关系,但是这样所有的⼦类都具有叫声和飞⾏的⾏为了,不能这样⽤第⼆种⾓度:我们采⽤接⼝的形式,让⽗类实现这两个接⼝,其他⼦类进⾏覆盖,有的鸭⼦就覆盖,没有就不覆盖,这样的写法带来的问题是,以后要是有新的⾏为加⼊进来,⼦类和⽗类还要修改引⼊第⼆个设计原则:针对接⼝编程,⽽不是实现编程那么这样考虑以后,有了另⼀种⾓度第三种⾓度:设计两个接⼝,⼀个叫,⼀个飞⾏,然后写各⾃的实现类,叫声类,和飞⾏类,将这两个类的接⼝⾏为组合在鸭⼦的⽗类中,即鸭⼦⽗类持有这两个⾏为接⼝,⽗类写两个⽅法,使得有些鸭⼦可以请求叫⽅法,有的可以请求飞⾏的⽅法,让⼦类来传递飞⾏和叫的⽅式,⽐如:有的“呱呱叫” 有的不叫,有的飞⾏有的像⽕箭⼀样为了实时修改这两个类,加⼊设置的set⽅法动态修改叫和飞⾏的⾏为问题:这⾥⽗类也有了叫和飞⾏的⾏为,是不是违背了之前说的不⽤继承,特殊⾏为应该在某些⼦类上问题:这⾥要考虑我们之前说的变化是什么?1,叫和飞⾏的⾏为区别于⼀般鸭⼦,只是这样的⼀种,2.叫和飞⾏的⾏为有⼀类这样的⾏为了1.策略设计模式上⾯的例⼦貌似是特意为策略设计模式制定的,那么我们该怎么样分析这个模式算法簇的替换,⽽不影响其他的⾏为模式结构:⼀个接⼝,多个实现类,⽤这个接⼝来维护⼀种或多种⾏为,不同的实现类相互替换(⾮典型的策略模式)//飞⾏接⼝public interface FlyBehavor{void fly();}//飞⾏⾏为类public RebotFly implements FlyBehavor{public void fly(){//添加⾃⾝的⾮⾏为}}public class Duck{private FlyBehavor mFlyBehavor;public Duck(FlyBehavor mFlyBehavor){this.mFlyBehavor = mFlyBehavor;}public void performFly(){mFlyBehavor.fly();}}思考:1.典型的策略模式的结构和适⽤场景策略模式典型是Context(场景),Strategy(接⼝策略),策略⼦类,场景对接⼝策略进⾏持有,利⽤⼦类替换达到不同算法的⽬的适⽤场景:⽤同⼀个⽅法,来计算不同的业务关系,制定不同算法2.适⽤构造⽅法传参,还是适⽤setter⽅式,有什么区别,各有什么优缺点?构造⽅法在初始化定义传⼊参数,setter⽅式是改变当前对象的持有属性,setter⽤于⼀个对象多次改变⾃⾝属性2.状态模式状态模式是对象通过改变⾃⾝的属性,来改变其⾏为(⽅法),达到消除条件判断语句的作⽤状态模式的结构重点:ContextState(对象场景),State(对象持有状态属性),状态⼦类,状态⼦类和策略⼦类的区别就是状态⼦类通过⽅法传递⼊参ContextState来修改本⾝状态1public class ContextState{2public State mState;3public int hour;//状态属性4public void setState(State state){5 mState = state;6 }7public void request(){8 mState.handle(this)9 }10 }1112public interface State{13void handle(ContextState state);14 }1516public StateA implement State{17public void handle(ContextState context){18//这⾥⽤来改变当前对象的状态19 context.state = new StateB();20if(context.hour < 12){21//上午⼯作很充实22 }else{23//不符合条件继续向下分发24 context.setState(new StateB());25 context.request();26 }27 }28 }29public StateB implement State{30public void handle(ContextState context){31//这⾥⽤来改变当前对象的状态32 context.state = new StateA();33if(context.hour < 12){34//上午⼯作很充实35 }else{36//不符合条件继续向下分发37 context.setState(new StateA());38 context.request();39 }40 }41 }以上代码仅供参考思考:1.状态模式必须有相应的状态属性吗?这种状态可以⽤枚举来代替吗?2.状态模式适⽤的场景有哪些,是通过什么样的出发点来使⽤状态模式的?状态模式的出发点就是对象本⾝状态的改变来修改⾏为,那这种状态可以是多个吗?3.观察者模式相关例⼦的引⼊是做⼀个⽓象发布器,将系统发布的⽓象信息显⽰在多个公告栏上多个公告栏的实时更新是核⼼部分,变化的位置是在哪⾥?⽐如添加或减少⼀个信息公告栏,信息公告栏的主要功能变化,公告栏的外观的变化,发布信息的数据结构变化(接⼊其他系统的⽓象信息)之前的设计⽅式是否合理,这个是根据OO设计经验来完成的,要多积累才⾏之前的设计是在⽓象更新器中写死⽓象信息更新的类,有信息更新,就发送给公告栏,这样的设计有什么问题吗?问题1.如果多个公告栏中有⼀个不⽤了,这样我们要⼿动删除代码,测试,问题2.⽓象加⼊了新的公告信息,加⼊新的字段,⽐如温度,湿度,风向,级别问题3.OO设计思想是什么?为什么要这样⽤?问题1.违反了OO设计原则:对扩展开发,对修改关闭问题2.将所有的类统⼀成⼀个整体问题3.设计类交互的松耦合⽽努⼒模式结构:"推"消息被观察者(⽓象站)观察者(公共栏)拥有对所有观察者的引⽤(集合)提供⼀完整的更新接⼝(update)信息更新(遍历,将⽓象信息传递给公共栏)-----------------------------------------------------------------------------------"拉"消息被观察者(⽓象站)观察者(公共栏)拥有对所有观察者的引⽤(集合)提供⼀完整的更新接⼝(update(obseverable,obj)信息更新(遍历,将⽓象信息传递给公共栏)观察者模式主要的结构⼀个被观察者,多个观察对象,当被观察者改变时通知其他观察对象作出改变(⼀个对象内部状态改变的同时通知其他对象改变)被观察者拥有观察者的集合,并且拥有添加和移除,通知⽅法,观察者有抽象的更新数据接⼝思考:1.怎样实现⼀个对象既是观察者也是被观察者,在Java中有系统库可以实现吗?2.观察者模式适⽤的场景有哪些?4.装饰模式作⽤:对⼀个对象已有功能动态的添加更多功能的⼀种⽅式优点:有效的区分类的核⼼功能和装饰功能,在特殊时间或特定时期给核⼼功能添加部分装饰代码结构:⼀个通⽤的装饰接⼝,装饰类及其⼦类,//接⼝public interface Compent{void Operation();}//装饰类public Decorate implement Compent{protected Compent mCompent;public void setCompent(Compent compent){mCompent = compent;}public void Operation(){mCompent.Operation();}}//装饰类的⼦类public DecorateA extends Decorate{private String msg;public void Operation(){//添加⽂案输出功能System.out.println(msg);super.Operation();}}//特殊情况下,装饰类和装饰⼦类可以进⾏合并。
建筑设计方法之我见(全文)

建筑设计方法之我见引言建筑与人是密不可分,相互关联的。
人类生活及意识形态决定了建筑的意义。
建筑设计反映着人类对自然的认知和人类社会的进展的形态。
简单的讲,建筑设计的好坏将直接影响着每个人的生活质量。
作为从事建筑设计的人员来说,人性化的、不断完善的、优秀的建筑设计将直接作用于RM生活,从而带动整个社会的进展。
一、当代建筑设计构成内容1、建筑功能特点以及建筑设计建筑工程作为满足建筑群体用途以及使用要求的重要内容,是居民建筑房屋的核心目标。
在日常生活中,建筑作为供人类居住、使用的基础设施,主要由木材、钢材、钢筋、混凝土、石材等相关建筑材料建设而成;例如:体育馆、桥梁、住房、寺庙、学校、医院等。
广义的建筑物还包括园林艺术、金石雕刻等,建筑物在使用规定年限内,满足耐久、安全、经济、适用等特定功能。
建筑技术工艺作为历代建筑房屋的重要手段,主要包括建筑结构、材料、物理构造、设备工程、建筑工程施工技术等各种技术措施。
在实际设计过程中,不仅要充分考虑建筑材料类型,根据具体建筑物理护理学要求以及相关设计规范,在建筑群体设备以及施工方面进行精细规划,从整体以及细节中进行设计整理。
2、建筑物艺术形象在当代建筑设计中,建筑艺术形象作为当今人类房屋建筑的重要目的,主要包括建筑物群体、单个体型、内外空间组合、细部处理、建筑物立面构图、建筑材料色彩、建筑材料质感以及光影变化等因素造成了综合艺术形式。
随着精神文明的进展,居民在建筑物外部设计追求新奇、奇特的同时,要求以自我特色、环境特色、文化特色为核心,突出建筑物设计特点;在亲切、温馨的同时,杜绝建筑工程“拒人于千里之外”的感受。
在建筑物内部设计过程中,根据空间利用的目标,在经济有用舒适的同时,保障建筑物创新设计。
3、建筑设计经济合理经济合理作为当代建筑设计的基本要求,在设计中必须充分结合当地经济情况以及历史情况,以人与自然为核心,在保障资金成本的同时,降低建筑施工设计经费。
在这个过程中,建筑构造设计每个环节都必须充分结合合理经济的原则,在建筑过程中就地取材,时刻注重建筑工程木料、水泥、钢材、混凝土等材料选用,在确保质量的前提下有效降低造价。
java设计模式实验心得

java设计模式实验心得
总的来说,通过实验应用设计模式,我深刻理解了设计模式的价值和应用,提高了自己的 编码能力和设计思维。设计模式是一种非常有用的工具,可以帮助我们编写出高质量、可维 护和可扩展的代码。在今后的开发中,我会继续学习和应用设计模式,不断提升自己的软件 设计和开发能力。来自java设计模式实验心得
在进行Java设计模式的实验过程中,我获得了以下几点心得体会:
1. 理解设计模式的概念:在实验之前,我首先对各种设计模式进行了学习和理解。了解每 个设计模式的用途、原理和适用场景,这有助于我在实验中正确地选择和应用设计模式。
2. 实践是最好的学习方式:通过实验,我深刻体会到了设计模式的实际应用价值。在实验 中,我遇到了各种问题和挑战,但通过应用适当的设计模式,我能够更好地组织和管理代码 ,提高代码的可维护性和可扩展性。
java设计模式实验心得
3. 选择适当的设计模式:在实验中,我遇到了许多不同的问题和需求,每个问题都可以使 用多种设计模式来解决。选择适当的设计模式是关键,这需要对问题进行深入分析和理解, 并权衡每个设计模式的优缺点。
4. 设计模式的灵活性和复用性:设计模式提供了一种通用的解决方案,可以在不同的场景 中复用。通过合理地应用设计模式,我能够编写出更加灵活和可复用的代码,减少了代码的 冗余和重复。
设计模式学习心得

竭诚为您提供优质文档/双击可除设计模式学习心得篇一:学习设计模式的一些感想设计模式在编程中的应用我们在发现问题到解决问题这个过程中,常会发现很多问题是重复出现的,或是某个问题的变体,外在不同,而本质相同,建筑学上如是,软件行业也是,这些问题的本质就是模式。
有人说,设计模式并不是一日两日能够理解的,当编程经验到了一定程度,便迫切的需要设计模式来完善自己的代码、优雅自己的设计,以及减少重复编码,这句话也是蛮有道理的,以自己的亲身经历来说,当刚开始编程时,没有一点设计理念,等到开设这门课以后再细读理解,把里面的思想带到自己的项目中,就会觉得有很多值得深思的地方。
本文以我在以往项目中遇到的三个编码问题来谈谈学习设计模式的必要性。
一、代码量激增、程序可维护性面临挑战我想这样的代码我们从学习c语言就开始接触,现在很多地方还在用,以后工作可能用的更多但是,大家都写的东西,我们自己的优势在哪里呢?1.过多的if?else判断if(type==1){//调用获取信息方法1}elseif(type==2){//调用获取信息方法2??.}else{//调用获取信息方法7}这是我在做一个项目中看到的一段代码,那个条件判断非常之长,有7个条件分支,而且其他有些地方也有根据类型来做不同处理的情况。
2.多次载入资源(例如配置文件的读取),引起资源损耗publicstaticstringgetproperty(stringpropKey)throwse xception...{propertiesprop=newproperties();InputstreampropconfFile=util.class.getclassLoader() .getResourceAsstream("configure.properties");//载入propconfFile到prop中,从prop中获取propKey 的值,并将其返回}该段代码是我以前在一个项目中写的一段代码,该段代码用于读取配置文件的属性,但该段代码是存在一些问题的,因为在每次获取属性时,它都重新载入资源,造成了资源的过多损耗。
设计模式使用前后心得分享

设计模式使用前后心得分享在软件开发中,设计模式是一种提高代码可读性、可维护性和可扩展性的方式。
设计模式是一种在解决特定问题时经过多年验证和证明的最佳实践。
在我从事软件开发的多年里,使用设计模式已成为我的习惯。
在这篇文章中,我将分享一些我在使用设计模式前后的心得体会。
一、设计模式前的困惑在我刚开始学习软件开发的时候,我对设计模式一无所知。
在我的第一份工作中,我曾在一个代码库中发现了一些看起来很奇怪的代码。
这些代码看起来非常不符合常理,我不得不求助于我的同事解决这个问题。
最后,我才意识到这些代码居然是设计模式的典型实现。
在我的第二份工作中,我开始了解设计模式的作用和应用。
这也是我第一次写观察者模式和策略模式的代码。
尽管我很兴奋地尝试实现设计模式,但我充满了疑惑。
我不明白设计模式的实际用途和优势,我还担心我会在错误的地方使用它们。
二、设计模式的实际应用直到我开始使用设计模式之后,我才发现它们真正的用途和优势。
一个好的设计模式可以改善代码的可读性、可维护性和可扩展性。
另一个重要的优势是,因为它们是已经被证明的解决方案,所以其他开发人员非常容易理解你的代码,尤其是对那些已经掌握它们的人来说。
尽管设计模式的应用有时会给我们带来麻烦,但是越来越多的公司已经开始在其软件开发中采用这种方法。
在我现在的公司中,我们一直使用设计模式来提高我们的代码质量和性能,以及减少错误和草率的编码。
三、设计模式所带来的变化通过了解设计模式的应用,我开始改变我的编码方式。
一个正确的设计模式可以使我们的代码更加可读、清晰并且容易扩展。
这些改变可能不会在一天之内发生,但是随着时间的推移,您将发现在代码中使用设计模式的优势所在。
为了加深我的理解,我不仅阅读了许多关于设计模式的文章和实现,而且还参加了一些关于设计模式的研讨会和会议。
通过这些会议,我得以与设计模式开发人员交流,分享看法和经验。
四、设计模式的使用建议设计模式的使用需要遵循一些规则和建议。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计模式之我见陈玉好联系电话:1523163855邮箱:1307041983@刚开始学习设计模式的时候,感到这些模式真的非常抽象。
今年下半年以来,随着我们组工作重点的转移,以及我在小组中角色的变化,我开始有条件提出自己对新系统的设计想法。
在设计过程中,我发现了很多设计模式的用处,也确实应用了很多设计模式,这让我越来越感到设计模式的重要性,因此我写了这十余篇专门介绍设计模式的文章,作为我的学习笔记。
《设计模式——可复用的面向对象软件的基础》(有趣的是,梅宏一再在组会上强调应该译成重用)中介绍了一共23种设计模式,我一共写了19个设计模式(其中三个和在一篇文章中),余下四个,考虑到该模式的应用范围我就没有介绍。
在写这些文章时,其中的很多例子都是我在实践中提炼出来的,当然也有很大一部分是《设计模式》中的例子。
不过,这四个人(四人团)生活的年代里现在已经很远了,所以它们的例子也很古老。
让我们更加设计模式设计模式是个好东西,它给出了很多设计中的技巧与思路,对于很多优秀的设计,它加以总结与提炼。
设计模式并非四人团拍脑瓜想出来的,而是他们搜集了其他人优秀的设计,加以整理出来的,他们不是这些模式的创造者,仅仅是整理者。
应用设计模式会给我们带来很多好处:软件将变得更加灵活,模块之间的耦合度将会降低,效率会提升,开销会减少。
更重要的,设计模式就好像美声唱法中的花腔,让你的设计更加漂亮。
总的来说,设计模式似乎将软件设计提升到艺术的层次。
设计模式已经被广泛的应用了,在现在很多的图形界面框架都使用了MVC模式,大量跌代器模式的应用,彻底改变了我们对集合的操作方式。
不仅如此,应用了设计模式的设计,往往被看成为优秀的设计。
这是因为,这些设计模式都是久经考验的。
在学习和使用设计模式的时候,往往出现一个非常严重的误区,那就是设计模式必须严格地遵守,不能修改。
但是设计模式不是设计模型,并非一成不变。
正相反,设计模式中最核心的要素并非设计的结构,而是设计的思想。
只有掌握住设计模式的核心思想,才能正确、灵活的应用设计模式,否则再怎么使用设计模式,也不过是生搬硬套。
当然,掌握设计模式的思想,关键是要仔细研究模式的意图和结构。
一个模式的意图,就是使用这个设计模式的目的,体现了为什么要使用这个模式,也就是需求问题。
这个模式的结构,就是如何去解决这个问题,是一种手段、一种经典的解决方法,这种解决方法只是一种建议。
两个方面结合起来,明白为什么需要设计模式,同时明白了如何实现这个模式,就容易抓住模式的本质思想。
在抓住意图和结构的基础上,实践也是掌握设计模式的必要方法。
当然,设计模式必须在某个场景下得到应用才有意义,这也是为什么《设计模式》中提供了大量的例子用来说明模式的应用场景,这实际上为读者提供了一种上下文环境。
学外语不是要强调“语言环境”么,学习设计模式也是这样。
不要设计模式看到网上很多人在讨论设计模式,他们确实很有***,满嘴都是模式的名字,恨不得写个Hello World都要应用到设计模式。
设计模式确实是好东西,但是,中国有句古话叫作物极必反,即便是按照辩证法,事物总要一分为二的看。
我们说设计模式的目的是为了让软件更加灵活,重用度更高。
但是,某种意义上,设计模式增加了软件维护的难度,特别是它增加了对象之间关联的复杂度。
我们总说,重用可以提高软件开发的效率。
如果你是大牛,你自然希望你的设计可以被反复使用10000年,那就是:当世界毁灭的时候,你的设计依然存在。
然而,现实是一个系统的设计往往在5年之内就会被抛弃,这是因为:1,软件技术产生了新的变化,使用新的技术进行的设计,无论如何都比你的设计好;2,硬件环境发生了很大变化,你的设计里对开销或者效率的追求已经没有意义了;3,新的大牛出现了,并且取代了你的位置。
应用设计模式会导致设计周期的加长(因为更复杂了),但是很多项目还在设计阶段就已经胎死腹中,再好的设计也没有发挥的余地。
当我们向设计模式顶礼膜拜的时候,我们还必须清醒地看到软件生产中非技术层面上的东西往往具有决定性作用。
理想固然崇高,但现实总是残酷的。
如何看清理想与现实的界限,恐怕是需要我们在实践中不断磨砺而体会出来的。
在看完设计模式后,不妨反问以下自己,这些模式究竟能给你带来什么?Interpreter、Iterator、State模式(解释器模式、迭代器模式、状态模式)Interpreter模式:这个模式主要试图去解释一种语言。
如果你学过形式语言,那么这个模式对你来说是多余的。
Iterator模式:这个模式试图隐藏集合的内部表示,又同时可以使用户依次访问集合中的元素。
现在STL和Java的跌代器就是应用这个模式的结果。
State模式:这个模式的意图是允许对象在其状态改变时修改其行为,好像对象改变了。
这个模式的应用场景是当对象的行为依赖于对象的状态时。
为了实现这个模式,我们可以为每个状态下的行为实现一个类,当对象的状态发生改变,它调用不同状态对象的实例方法。
注意,以前可能需要使用switch或者if语句进行分支转换,现在则利用多态机制完成。
Flyweight模式(享元模式)这个模式利用共享有效的支持大量的细粒度的对象。
比如,编辑软件中,一篇文章有很多个字符,我们可以对每个字符对象生成一个对象,如果这篇文章有几M个文字,那么对象的数量肯定是不能容忍的。
使用Flyweight模式,我们将所有的文字对象共享起来,文章中的字符仅仅是指向共享池中的某个对象的索引。
在这里要搞清楚一件事情,利用Flyweight模式不会有效地减少信息的数量(也就是软件的空间开销),因为无论是否共享,表达这么多信息所需要的编码数量是一定的,所以开销不会大幅减小。
只是,这个模式会减少系统中对象的数量,因为大量的对象会被共享。
在编辑软件中,字符对象被共享,那么一篇文章中的文字,可以按照段落、格式等等进行结组,一组文字构成一个对象,这样对象从单个文字变成一组文字,数量大幅减少。
在使用Flyweight模式需要注意的一点,由于对象被共享了,因此这些对象没有各自的属性,那么根据上下文环境,我们在使用这些对象的时候,必须向它传递一些参数。
在编辑软件中,这些参数可能就是字体、字号、颜色等等信息。
使用Flyweight模式还有一个好处,那就是我们可以在不修改系统的情况下增加享元。
Command模式(命令模式)Command模式,将一个请求封装为一个对象。
这样,你可以向客户端发送不同请求的参数,排队或记录请求,同时可以支持不能执行的请求。
在软件中,不同的模块、对象之间经常会各种调用,或者我们称之为请求。
传统的方法,我们将请求实现为函数调用。
这样做是最简单的方法,但却在无形之中增加了模块之间的耦合度。
当请求发生很大变化的时候,系统将变得很难维护。
与此同时,当服务端(接受请求的一端)增加或者删除一个请求的时候,按照传统的方法,客户端(发送请求的一端)也必须重新编译(这一点在删除请求的时候最明显),这样系统才能正确运行。
使用Command模式的一个核心思想就是,服务端提供一个统一的请求处理接口,客户端则通过调用接口向服务端发送请求,这些请求被封装成对象的形式(或者其等价形式)。
在《设计模式》中,“四人团”并没有强调统一接口的事情,它强调了另一个方面,那就是封装请求。
事实上,封装一个请求总是要求有一个地方来接受和处理这个请求的,这个地方实际上就是统一请求接口。
在《设计模式》中,请求被封装成一个Command对象,这个对象保存着请求类型、参数等信息,服务端收到这个命令后就会执行Command对象中的Execute()函数,这个函数具体实现了真正的操作。
这种实现方法可以保证增加新的请求而不必重新编译服务端。
我个人认为,Command模式的另一个形式就是在服务端实现各种操作,Command 对象只是负责指明请求的类型,这样,当服务器端发现请求不正确时,可以忽略该请求。
和上一种形式相比,这种形式更加简洁(因为可以不真正实现Command对象,在C++中可以使用不定参数实现),但是缺少灵活性。
Command模式使得记录请求成为了可能,我们可以捕获系统中的请求对象,记录他们。
Composite模式(组合模式)Composite模式的意图是“将对象组合成树形结构表示…整体-部分‟的层次结构。
Composite使得用户对单个对象和组合对象的使用更具有一致性”。
在Word中我们经常会将一些图元进行“组合”,组合以后的图形还可以向简单图元那样进行移动、变形等等操作;除此以外,在Word中,我们对于一个字符、一个词组、一句话、一个段落,甚至是整篇文章的操作是相同的,我们都可以进行剪切、复制,进行字体与大小的调整,进行颜色的变换。
这些例子都是Composite模式的实例,我们将简单的元素组合成复杂的元素,然后还可以像操作简单元素那样操作组合元素。
Composite模式将子元素组织成树型,实际上,组织成图型也没有问题。
用户总是喜欢组合简单元素,一方面,用户可以通过这样的组合来进行抽象,另一方面,用户可以通过组合化简繁琐的操作。
Composite模式在各种可视化编辑软件中应用得最为广泛。
另一使用Composite的经典例子是Java的Swing系统。
所有的Swing组件都是继承自一个叫做JComponent的接口,因此,我们对一个JFrame的操作和对一个JButton 的操作是一样的。
这同时也使得,JFrame在管理自己的子元素时,它不需要知道他们是一个JButton还是一个JPanel,对它来说,这只是一个JComponent。
实现Composite模式的关键是良好设计的接口,人们应该对可能的元素(简单的、组合的)进行分析,并设计出通用的操作。
尽可能的保证接口操作对所有元素都是有意义的,否则就应该将那些只对部分元素有意义的操作下放到子类中。
Proxy模式(代理模式)按照“四人团”的说法,Proxy模式可以为控制另一个对象而提供一个代理或者占位符。
这个模式可以使我们在真正需要的时候创建对象,如果我们不需要这个对象,Proxy模式会为我们提供一个占位符。
如果我们有大量这样消耗很大的对象的时候,我们就可以使用Proxy模式,初始情况下,Proxy模式只会提供占位符而不会真正创建对象,但是对于使用者来说,他看到是真正的对象而不是一个代理。
一旦使用者需要获得或者更改对象属性的时候,Proxy模式就会创建该对象,在此之后,我们就可以通过代理访问真正的对象了。
在Word里面应该是使用了Proxy模式。
打开一篇含图的很长的文档时,大部分的图片都不会被载入,而仅仅是提供占位符,只有当用户准备察看这一页的时候,代理才会真正载入图片。
和Singleton模式一样,Proxy模式都是保证我们可以按需分配对象,不同的是,Singleton模式还会保证在全局范围内使用同一个对象实例,而Proxy则没有这个功能。