Design Pattern设计_第1页
Design Pattern设计_第2页
Design Pattern设计_第3页
Design Pattern设计_第4页
Design Pattern设计_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、什么是模式?模式是解决问题的行之有效的经验和一些规律。(新手和专家的本质区别)什么是设计模式?设计模式是模式思想在软件设计领域的投影和应用。也就是说,设计模式是软件设计中的行之有效的经验和一些规律。不断重复发生的问题及其该问题的解决方案的核心。(名称、问题、解决方案、效果)为什么要用设计模式? 共享并使用专家的设计经验 增加软件的灵活性、复用性 简单方便地复用成功的设计与体系结构 建立并运用通用术语对设计模式的基本认识思考层次:OO的更高一层视图(不同0-0之间的有效关系/继承是同一0体系对象关系)复用的真正含义解决开发效率(适应可变性,应对需求变化),而非运行效率质量问题分层思想的一个具体应

2、用控制结构稳定设计模式建立的基本思路寻找合适的对象决定对象的粒度指定对象的接口描述对象的实现运用复用机制支持变化削弱依赖分层和分解任务单一两大原则:找出变化并封装之优先使用对象聚合,而不是类继承通过显式地指定一个类来创建对象(分层:间接地创建对象)Abstract Factory, Factory Method,Prototype消除算法以来Strategy模型、模式、框架、体系结构抽象程度:模型、体系结构、模式、框架粒度:模式、框架、体系结构类型设计模式可变的方面创建Abstract FactoryBuilderFactory MethodPrototypeSingleton产品对象家族如何

3、创建一个组合对象被实例化的子类被实例化的类一个类的唯一实例结构AdapterBridgeCompositeDecoratorFacadeFlyweightProxy对象的接口对象的实现一个对象的结构和组成对象的职责,不生成子类一个子系统类的接口对象的存储开销如何访问一个对象;该对象的位置类型设计模式可变的方面行为Chain of ResponsibilityCommandInterpreterIteratorMediatorMementoObserverStateStrategyTemplate MethodVisitor满足一个请求的对象何时、怎样满足一个请求一个语言的文法及解释如何遍历、访

4、问一个聚合的各元素对象间怎样交互、和谁交互一个对象中哪些私有信息存放在该对象之外,以及在什么时候进行存储多个对象依赖于另外一个对象,而这些对象又如何保持一致对象的状态算法算法中的某些步骤某些可作用于一个(组)对象上的操作,但不修改这些对象的类外观Faade模式FacadeFacade适配器Adapter模式ClientTarget+request()Adapter+request()Adaptee+specificRequest()Adaptee-specificRequest()ConcreteTarget+request()ConcreteTarget+request()?ClientTa

5、rget+request()Adaptee+specificRequest()ConcreteTarget+request()ConcreteTarget+request()+request()()+specificRequest()()+request()()+specificRequest()()X适配器Adapter模式ClientTarget+request()Adapter+request()Adaptee+specificRequest()Adaptee-specificRequest()AdapterAdaptee策略Strategy模式Clientoriginal calcTa

6、x that does US tax?SalesOrder+calcTax()CanadianSalecOrder+ calcTax()new (overridden) calcTax that computer Canadian taxChinaSalecOrder+ calcTax()new (overridden) calcTax that computer China tax如此反复特化,要么会使代码变得无法理解,要么产生冗余。如此反复特化,要么会使代码变得无法理解,要么产生冗余。特化技术最终总是会产生太深的继承层次,导致程序难以理解特化技术最终总是会产生太深的继承层次,导致程序难以理

7、解(弱内聚)(弱内聚)存在冗余、难以测试,而且多个概念耦合在一起。存在冗余、难以测试,而且多个概念耦合在一起。 其他方面(日期格式、语言、运费规则等),如何通过继承解决??策略Strategy模式Clientoriginal calcTax that does US tax?SalesOrder+calcTax()CanadianSalecOrder+ calcTax()new (overridden) calcTax that computer Canadian taxChinaSalecOrder+ calcTax()new (overridden) calcTax that comput

8、er China taxCalcTax+taxAmount(各种影响计算规则的可能变化的参数)USTax+taxAmount()CanadianTax+taxAmount()ChinaTax+taxAmount()1 1、封装变化、封装变化策略Strategy模式ClientSalesOrder+calcTax()CalcTax+taxAmount(各种影响计算规则的可能变化的参数)USTax+taxAmount()CanadianTax+taxAmount()ChinaTax+taxAmount()2 2、分离职责、分离职责ClientContext+ContextInterface()St

9、rategy+AlgorithmInterface()ConcreteStrategyA+ AlgorithmInterface()Strategy策略Strategy模式ConcreteStrategyB+ AlgorithmInterface()ConcreteStrategyC+ AlgorithmInterface()StrategyClient桥接Bridge模式Shape+draw()Rectangle+draw()Circle+draw()Drawing+drawLine()+drawCircle()V1Drawing+drawLine()+drawCircle()V2Drawi

10、ng+drawLine()+drawCircle()Shape+draw()Rectangle+draw()#drawLine()Circle+draw()#drawCircle()V1 Rectangle+drawLine()V2 Rectangle+drawLine()V1Circle+drawCircle()V2Circle+drawCircle()DP1+draw_a_line()+draw_a_circle()DP2+drawline()+drawcircle()抽象(Shape的种类)和其实现(绘图程序)的紧耦合性带来类组合爆炸问题: Abstraction1 Implementa

11、tionA Abstraction2 ImplementationB Abstraction3 ImplementationC Abstraction4 ImplementationD 需要一种方式将抽象上的变化和实现上的变化分开,使类的数量仅仅是线性地增加(多维转变为一维/算法特性)Client桥接Bridge模式Shape+draw()V1Shape#drawLine()#drawCircle()V2Shape#drawLine()#drawCircle()V1 Rectangle+draw()V1Circle+draw()V2 Rectangle+draw ()V2Circle+draw

12、()DP1+draw_a_line()+draw_a_circle()DP2+drawline()+drawcircle()DP1和DP2之间的冗余消除。但是,两种Rectangle和Circle之间的冗余无法消除(每一对都有自己的draw()方法)。用对象职责思考,而非用对象结构思考Client桥接Bridge模式Shape+draw()Rectangle+draw()Circle+draw()Drawing+drawLine()+drawCircle()V1Drawing+drawLine()+drawCircle()V2Drawing+drawLine()+drawCircle()Sha

13、pe+draw()Rectangle+draw()Circle+draw()Drawing+drawLine()+drawCircle()V1Drawing+drawLine()+drawCircle()V2Drawing+drawLine()+drawCircle()DP1+draw_a_line()+draw_a_circle()DP2+drawline()+drawcircle()Adapter Pattern职责分离,分别适应变化,互不影响ClientShape+draw()Rectangle+draw()Circle+draw()Drawing+drawLine()+drawCirc

14、le()V1Drawing+drawLine()+drawCircle()V2Drawing+drawLine()+drawCircle()DP1+draw_a_line()+draw_a_circle()DP2+drawline()+drawcircle()桥接Bridge模式抽象与实现的解耦ClientAbstraction+Operation()Implementor+OperationImp()ConcreteImplementorA+ OperationImp()Bridge桥接Bridge模式impConcreteImplementorB+ OperationImp()Refine

15、dAbstractionImp-OperationImp();Bridge不同抽象之间的关系(桥接)工厂Factory Method模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method模式使一个类的实例化延迟到其子类。DocumentOpen()Close()Save()Revert()MyDocumentApplicationCreateDocument()NewDocument()OpenDocument()MyApplicationCreateDocument()Document * doc=CreateDocument();docs.Add(doc)

16、;doc-Open();return new MyDocumentdocs工厂Factory Method模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method模式使一个类的实例化延迟到其子类。ProductConcreteProductCreatorFactoryMethod()AnOperation()ConcreteCreatorFactoryMethod()in AnOperation(),have the following:product=FactoryMethod()return new ConcreteProductJava中, 集合的iter

17、ator方法;C#中,集合实现的IEnumerable接口,该接口定义的GetEnumerator方法;C+中,begin()方法和end()方法等。Factory Method模式在定义框架(Framework)时非常有用。因为框架处于抽象层次,不知道而且也不应操心具体对象的实例化。它们需要将有关具体对象的决策推迟给框架的用户。工厂Factory Method模式public interface Person public String sayHello(String name); public String sayGoodBye(String name);public class Amer

18、ican implements Person public String sayHello(String name) return name + ,Hello; public String sayGoodBye(String name) return name + ,Good Bye; public class Chinese implements Person public String sayHello(String name) return name + ,您好; public String sayGoodBye(String name) return name + ,下次再见; pub

19、lic class PersonFactory public Person getPerson(String ethnic) if (ethnic.equalsIgnoreCase(chin) return new Chinese(); else return new American(); public class FactroyTest public static void main(String args) PersonFactory pf = new PersonFactory(); Person p = null; p = pf.getPerson(chin); System.out

20、.println(p.sayHello(wawa); System.out.println(p.sayGoodBye(wawa); p = pf.getPerson(ame); System.out.println(p.sayHello(wawa); System.out.println(p.sayGoodBye(wawa); import org.springframework.context.ApplicationContext;import org.springframework.context.support.FileSystemXmlApplicationContext;public

21、 class SpringTest public static void main(String args) ApplicationContext ctx = new FileSystemXmlApplicationContext(bean.xml); Person p = null; p = (Person)ctx.getBean(chinese); System.out.println(p.sayHello(wawa); System.out.println(p.sayGoodBye(wawa); p = (Person)ctx.getBean(american); System.out.

22、println(p.sayHello(wawa); System.out.println(p.sayGoodBye(wawa); Spring框架中的工厂模式实现WidgetFactoryCreateScrllbar()CreateWindow()WindowMotifWidgetFactoryCreateScrllbar()CreateWindow()PMWidgetFactoryCreateScrllbar()CreateWindow()PMWindow MotifWindowScrollBarPMScrollBar MotifScrollBarClient抽象工厂Abstract Fac

23、tory模式抽象工厂Abstract Factory模式AbstractFactoryCreateProductA()CreateProductB()AbstractProductAConcreteFactory1CreateProductA()CreateProductB()ConcreteFactory2CreateProductA()CreateProductB()ProductA2 ProductA1AbstractProductBProductB2 ProductB1ClientAbstract Factory模式可以用一系列Factory Method模式来实现抽象工厂Abstra

24、ct Factory模式抽象工厂Abstract Factory模式AbstractFactoryCreateProductA()CreateProductB()AbstractProductAConcreteFactory1CreateProductA()CreateProductB()ConcreteFactory2CreateProductA()CreateProductB()ProductA2 ProductA1AbstractProductBProductB2 ProductB1Client组成Composite模式GraphicDraw()Add(Graphic)Remove(Gr

25、aphic)GetChild(int)LineDraw()PictureDraw()Add(Graphic)Remove(Graphic)GetChild(int)graphicsfor all g in graphicsg-Draw ();ClientPictureaPictureaLineaRectangleaTextaLineaRectangleRectangleDraw()TextDraw()add g to graphics组成Composite模式ComponentOperation()Add(Component)Remove(Component)GetChild(int)Leaf

26、Operation()CompositeOperation()Add(Component)Remove(Component)GetChild(intchildrenfor all g in childreng-Operation();ClientaCompositeaCompositeaLeafaLeafaLeafaLeafaLeafaLeaf装饰Decorator模式动态地给一个对象(而不是整个类)添加一些额外的职责。比如:对任意一个用户界面组件添加一些特性(边框、窗口滚动等)。使用继承可以实现,但继承过来的功能可以被多个子类的实例所使用。该方法缺乏灵活性,因为功能的选择是静态的,用户不能控

27、制对组件添加特性功能的方式和时机。灵活的方法是,将组件嵌入到另一个对象中,由这个对象添加特性功能。这个嵌入的对象称为装饰。装饰与它所装饰的组件接口一致,因此它对使用该组件的客户透明。它将客户请求转发给该组件,并且可能在转发的前后执行一些额外的动作。透明性使得你可以递归地嵌套多个装饰,从而可以添加任意多的特性功能。装饰Decorator模式VisualComponentDraw()TextViewDraw()DecoratorDraw()ScrollDecotarorScrollPositionDraw()ScrollTo()BorderDecotarorborderWidthDraw() Dr

28、awBorder()componentDecorator:Draw();DrawBorder();component-Draw();DrawBorder(); Decorator:Draw();ComponentOperation()ConcreteComponentOperation()DecoratorOperation()装饰Decorator模式ConcreteDecotarorAaddedStateOperation()ConcreteDecotarorBOperation()AddedBehavior()10.1componentDecorator-Operation();Adde

29、dBehavior();component-Operation();生成器Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。生成器Builder模式RTFReaderParseRTF()TextConverterconvertCharacter(char)convertFontChange(Font)convertParagraph()ASCIIConverterconvertCharacter(char)GetASCIIText()TeXConverterconvertCharacter(char)convertFontChange(Font)con

30、vertParagraph()GetTeXtext()ASCIITextTeXTextTextWidgetwhile (t=get the next token) switch t.Type CHAR: builder-ConvertCharacter(t.Char);FONT: builder-ConvertFontChange(t.Font); PARA: builder-ConvertParagraph(); TextWidgetConverterconvertCharacter(char)convertFontChange(Font)convertParagraph()GetTextW

31、idgetBuilderBuilders生成器Builder模式DirectorConstruct()BuilderBuildPart()ConcreteBuilderBuildPart()GetResult()Product for all objects in structure builder-BuildPart(); Builder观察者Observer模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都可以得到通知并被自动更新。发布订阅(publish-subscribe)SubjectAttach(Observer)Detach(Observer)

32、Notify()ObserverUpdate()ConcreteObserverobjectStateUpdate() for all o in observers o-Update(); observersConcreteSubjectsubjectStateGetState()SetState() return subjectState; observerState = subject-GetState();subject观察者Observer模式Singletonstatic uniqueInstancesingletonDatastatic Instance()SingletonOperation()GetSingletonData() return uniqueInstance保证一个类仅有一个实例,并提供一个访问它的全局访问点。单件Singleton模式public class SingletonTest int value ; private

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论