从《深入浅出设计模式》摘录的设计原则:
1.识别出应用变化的部分,并把其与不变的分离(封装变化)。Identifytheaspectsofyourapplicationthatvaryandseperatethemformwhatstaysthesame.
2.面向接口编程,不要面向实现编程。Programtoaninterface,notanimplementation.
3.多用组合,而不是继承。Favorcompositionoverinheritance.
4.在交互的对象间,尽量设计得松耦合。Striveforlooselycoupleddesignsbetweenobjectsthatinteract.
5.类应该对扩展开放,对修改关闭。Classesshouldbeopenforextension,butclosedformodification.
6.(依赖倒转原则)依赖抽象,不要依赖具体类。Dependuponabstractions.Donotdependuponconcreteclasses.(在工厂模式中,PizzaStore是高层组件,Pizza是低层组件,两者都应依赖抽象)
遵守原则6的方法:a.变量不可以持有具体类的引用(当用new时,就会持有具体类的引用,可用工厂避免);b.不应让类派生自具体类(应派生自一个接口);c.不要覆盖基类已实现的方法。在实现应用中,应尽量遵守这些原则,而不是完全遵守,也不可能完全遵守。
7.最少知识原则:只和你的密友谈话。PrincipleofLeastKnowledge-talkonlytoyourimmediatefriends.
8.荷里活原则:别调用我们,我们会调用你。TheHollywoodPrinciple:Dontcallus,we'llcallyou.
9.单一职责原则:一个类只应有一个导致它变化的原因。(cohesion内聚力)aclassshouldhaveonlyonereasontochange.
号外:
依赖倒转原则和荷里活原则的区别:thedependencyinversionprincipleteachesustoavoidtheuseofconcreteclassesandinsteadworkasmuchaspossiblewithabstractions.TheHollyhoodprincipleisatechniqueforbuildingframeworksorcomponentssothatlower-levelcomponentscanbehookedintocomputation,butwithoutcreatingdependenciesbetweenthelower-levelcomponentsandthhighter-levellayers.
---------------------------------------------大家好我是神圣分割线-----------------------------------------------------------
设计模式定义:
1.策略模式:定义一组算法家族,封装每个算法并使之可互换。策略模式让客户可以独立地应对算法的变化。definesafamilyofalgorithms,encapsulateseachone,andmakestheminterchangeable.Strategyletsthealgorithmvaryindependentlyfromclientsthatuseit.
2.观察者模式:定义一对多的关系,当一个对象改变时,所有依赖者都会自动得到通知和更新。definesaone-to-manydependencybetweenobjectssothatwhenoneobjectchangesstate,allofitsdependentsarenotifiedandupdatedautomatically.
(Java内有Observable类和Observer接口,可实现。对于Observeable类相当于Subject,有Pull方式和Push方式。Pull是观察者主动取,Push是主题主动送数据。注意Observable是一个类,具体主题只能继承它,而Java又是单继承,会造成不便,另外Observable的setChanged()方法是protected,表明只能在子类中用,对于想用通过组合来使用observable是不可能的。所以对于Java内建的观察者模式要有取舍地用)
观察者模式在JDK中的应用:JavaBean和Swing。
3.装饰者模式:动态地给对象增加职责。装饰者提供一个比继承更有弹性的方案。attachesadditionalresponsibilitiestoanobjectdynamically.Decoratorsprovideaflexiblealternativetosubclassingforextendingfunctionality.
装饰者可以在被委托的对象之前或之后,把它的行为加上,以完成剩下的任务。Thedecoratoraddsitsownbehavioreitherbeforeorafterdelegatingtotheobjectitdecoratestodotherestofthejob.
在JDK中的应用:JavaIO。
缺点:会造成大量的小类
4.工厂模式:定义生产对象的接口,但工厂方法让类的实例化延迟到子类决定。definesaninterfaceforcreatinganobject,butletssubclassesdecidewhichclasstoinstantiate.FactoryMethodletsaclassdeferinstantiationtosubclasses.P.S.工厂模式包含Creator和Product两个类。其中工厂方法不一定为抽象方法,可以定义一个默认工厂方法。
Creator中,工厂方法的一般格式:abstractProductcreateMethod(Stringtype)
记住:工厂方法让子类决定实例化哪一个产品!与简单工厂不同的是:工厂方法提供一个通用的框架(或方法,例如代码中orderPizza()方法)来创建产品,其中对具体产品的创建过程延迟到子类执行(指代码中的抽象工厂方法createPizza())。FactoryMethodletssubclassdecidewhichclasstoinstantiate.而简单工厂只是封装创建产品的过程,未提供一个通用框架和实例化过程全在工厂内,没有所谓的子类。
6.单例模式:保证一个类只有一个实例,提供一个全局访问点。ensuresaclasshasonlyoneinstance,andprovidesaglobalpointofaccesstoit.
7.命令模式:把“请求”封装成对象,以便使用不同的请求,队列或日志来参数化其对象。也支持可撤消操作。encapsulatesarequestasanobject,therebylettingyouparameterizeotherobjectswithdifferentrequests,queueorlogrequests,andsupportundoableoperations.以下是命令模式中用到的术语解释:
Client:用于产生命令对象
Command:提供一个接口execute(),封装了调用Receiver的action()的过程。其具体类的常规格式,见代码:
publicvoidexecute(){receiver.action();}
Invoker:诉求者,调用setCommand(command_Obj),并提供方法来调用command的execute方法。
Receiver:包含一系列的action(),实际操作者。
(在书中,讲到一种NullObject的设计模式,当你不想在客户端逻辑中判断Null值时,可以通过设定默认对象为一个什么也不做的对象,如代码所示,表示一个什么也不做的Command)
publicclassNoCommandimplementsCommand{@Overridepublicvoidexecute(){//donothing}}7.适配器模式:把类的接口转换成客户期望的接口。适配器让那些因为不兼容接口的类可以合作无间。convertstheinterfaceofaclassintoanotherinterfacetheclientsexpect.Adapterletsclassesworktogetherthatcouldn'totherwisebecauseofincompatibleinterfaces.
8.装饰者模式:提供一个统一的接口,来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。providesaunifiedinterfacetoasetofinterfacesinasubsystem.facadedefinesahigher-levelinterfacethatmakesthesubsystemseasiertouse.
装饰者模式和适配器模式的区别,不在于包装多少个类,而是:两者的目的,适配器在于改变接口以匹配客户的期望;装饰者模式在于提供一个简化的接口。
9.模板方法模式:定义算法框架在一个方法里,某些步骤推迟到子类。模板方法让子类重定义算法的某些步骤,而不需要改变算法的结构。definestheskeletonofanalgorithminamethod,deferringsomestepstosubclass.templatemethodletssubclassesredefinecertainstepsofalgorithmwithoutchangingthealgorithm'sstructure.
在模板方法内,有三种类型的方法:primitiveOperation(),concreteOperation(),hook().对于ConcreteOperation一般为final,hook()方法是让子类覆盖的,也可以什么也不做,就是为了让子类选择性的覆盖。
10.迭代器模式:提供顺序访问聚合对象的元素的方法,而不需要暴露底层的实现。providesawaytoaccesstheelementsofanaggregateobjectsequentiallywithoutexposingitsunderlyingrepresentation.
11.组合模式:允许你将对象组合成树形结构,来表现“部分与整体”的层次结构,组合能让客户以一致的方式处理个别对象以及对象组合。allowsyoutocomposeobjectsintotreestructruestorepresentpart-wholehierarchies.Compositeletsclientstreatindividualobjectsandcompositionsofobjectsuniformly.
12.状态模式:允许对象在内部状态改变时,改变它的行为。对象看起来就像修改了它的类。allowsanobjecttoalteritsbehaviorwhenitsinternalstatechanges.theobjectwillapeartochangeitsclass.
状态模式和策略模式的区别:类图是一样的,不过两者的目的不同。状态模式的行为改变是在State内进行的,封装行为在状态对象内,可以简单地在上下文中改变状态对象来改变行为。策略模式通过改变子类来改变行为。另外在初始化时,策略模式是客户自行定义的,在状态模式中通常有默认的状态,客户不需要知道状态。
13.代理模式:(参考rmi)
工厂模式和抽象工厂模式的联系与区别:
两者都是封装产生实例化对象的模式,更好地解耦和灵活的设计。
总的来说:抽象工厂用于稳定的产生一组产品家族,而工厂模式通过factorymethod只产生一种产品。
在这些设计模式和原则中,策略模式是一个非常重要的行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换使用。策略模式让算法的变化独立于使用算法的客户端。以提供的文档内容为例,...
标题中的"设计模式定义与设计原则1"暗示了我们将讨论设计模式的基础概念和设计原则。其中提到的单一职责原则是面向对象设计的基本原则之一,也是SOLID原则的首字母缩写。SOLID代表:1.单一职责原则(Single...
这个PDF文档“24种设计模式介绍与6大设计原则”旨在帮助开发者理解和应用这些模式,提高代码的可维护性和可扩展性。以下是其中的主要内容:一、设计原则1.单一职责原则:一个类或模块应只有一个引起其变化的原因...
以下是关于"Android24种设计模式介绍与6大设计原则"的详细阐述:一、六大设计原则1.**单一职责原则(SingleResponsibilityPrinciple,SRP)**:一个类或模块应该只有一个引起它变化的原因。这意味着每个类应...
面向对象设计原则与设计模式是软件工程领域的重要组成部分,它们为构建高质量、可维护和可扩展的软件系统提供了指导方针。下面将详细阐述面向对象设计原则及其如何促进软件的复用,以及设计模式的概念。###面向...
###设计模式六大原则详解####一、开闭原则(Open-ClosedPrinciple)**含义:**开闭原则强调的是“对扩展开放,对修改关闭”。这意味着系统的设计应该是灵活的,能够轻松地添加新的功能而不需要修改现有代码...
设计模式定义讲解,设计模式定义讲解,设计模式定义讲解,设计模式定义讲解
设计模式和设计原则是软件开发中的重要概念,它们旨在提高代码的可读性、可维护性和复用性。设计模式是一套成熟的、被广泛接受的解决方案,用来解决常见的设计问题。设计原则则提供了指导思想,帮助开发者遵循良好的...
本资源包含的"24种设计模式介绍与6大设计原则"高清PDF,对于Java开发者来说是一份宝贵的参考资料。首先,我们来逐一探讨这24种设计模式:1.单例模式:确保一个类只有一个实例,并提供全局访问点。2.工厂方法...
这个压缩包文件"24种设计模式介绍与6大设计原则.zip"涵盖了软件开发中至关重要的两个方面:设计模式和设计原则。以下是它们的详细解读。**设计模式**1.**单例模式**:保证一个类只有一个实例,并提供全局访问点...
###Java的24种设计模式介绍与6大设计原则####第一部分:设计模式概览设计模式是在软件设计过程中经过验证的解决方案,用于解决在特定情境下出现的设计问题。这些模式提供了一种通用的方式,使得开发人员能够...
面向对象设计模式是软件工程领域一个非常重要的主题,它不仅涉及如何组织代码、构建系统,还关乎如何确保软件系统的灵活性、可扩展性和可维护性。本文将深入探讨面向对象设计中的核心原则,并通过具体示例来阐述这些...
《深入设计模式》还特别强调了软件设计原则的重要性,认为遵循良好的设计原则对于构建高质量的软件系统至关重要。-**优秀设计的特征**:优秀的软件设计应该具有清晰性、灵活性、可维护性和可扩展性等特点。-**...
设计模式不仅提供了交流的共同语言,还通过遵循经典的设计原则,如单一职责、开闭原则、里氏替换、依赖倒置、接口隔离、合成复用和迪米特法则,帮助开发人员在保持灵活性的同时减少错误和提高代码质量。