面向对象的设计原则与设计模式.ppt
【面向对象的设计原则与设计模式】【SOA实验室】目录目录1.1.面向对象的设计原则面向对象的设计原则2.2.设计模式概述设计模式概述3.3.设计模式详解设计模式详解4.4.设计即生活设计即生活5.5.设计模式讨论设计模式讨论面向对象的设计原则面向对象的设计原则面向对象的四个基本概念面向对象的四个基本概念抽象抽象封装封装(保持和促进系统的可维护性保持和促进系统的可维护性)继承继承(使得概念和定义可以复用使得概念和定义可以复用)多态多态(使得实现和应用可以复用使得实现和应用可以复用)设计目标设计目标可扩展性可扩展性(可扩展可扩展 Extensibility)灵活性灵活性(可修改可修改 Flexibility)可插入性可插入性(可替换可替换 Pluggability)面向对象的基点是世界是由各种各样的对象组成面向对象的基点是世界是由各种各样的对象组成!面向对象的设计原则面向对象的设计原则面向对象的设计原则面向对象的设计原则封装变化封装变化针对接口编程针对接口编程,不要针对实现编程不要针对实现编程(接口隔离原则接口隔离原则)组合优于继承组合优于继承(合成复用原则合成复用原则)开闭原则开闭原则(对修改关闭对修改关闭,对扩展开放对扩展开放)要依赖抽象要依赖抽象,不要依赖具体类不要依赖具体类(依赖倒转原则依赖倒转原则)最少知识原则最少知识原则,只和你的密友谈话只和你的密友谈话(迪米特法则迪米特法则)别调用我们,我们会调用你别调用我们,我们会调用你一个类应该只有一个引起变化的原因一个类应该只有一个引起变化的原因(单一职责原则单一职责原则)LiskovLiskov Substitution Principle(Substitution Principle(里氏替换原则里氏替换原则)设计目标是方向设计目标是方向,设计原则是方法设计原则是方法,设计模式是手段设计模式是手段.设计模式详解设计模式详解策略模式策略模式:定义了算法族,分别封装起来,算法之间可以互相替换,定义了算法族,分别封装起来,算法之间可以互相替换,此模式让算法的变化独立于使用算法的客户。此模式让算法的变化独立于使用算法的客户。设计模式详解设计模式详解策略模式要点策略模式要点:定义了算法族,分别封装起来,算法之间可以互相替定义了算法族,分别封装起来,算法之间可以互相替 换,此模式让算法的变化独立于使用算法的客户。换,此模式让算法的变化独立于使用算法的客户。设计模式详解设计模式详解观察者模式观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。改变状态时,它的所有依赖者都会收到通知并自动更新。设计模式详解设计模式详解观察者模式要点观察者模式要点:观察者模式定义了对象之间一对多的关系观察者模式定义了对象之间一对多的关系主题(也就是可观察者)用一个共同的接口来更新观察者主题(也就是可观察者)用一个共同的接口来更新观察者 观察者和可观察者之间用松耦合方式结合(观察者和可观察者之间用松耦合方式结合(loosecouplingloosecoupling),可观),可观察者不知道观察者的细节,只知道观察者实现了观察者接口察者不知道观察者的细节,只知道观察者实现了观察者接口使用此模式时,你可从被观察者处推(使用此模式时,你可从被观察者处推(pushpush)或拉()或拉(pullpull)数据)数据(然而,推的方式被认为更(然而,推的方式被认为更“正确正确”)有多个观察者时,不可以依赖特定的通知次序有多个观察者时,不可以依赖特定的通知次序J a v aJ a v a有多种观察者模式的实现,包括了通用的有多种观察者模式的实现,包括了通用的java.util.Observablejava.util.Observable要注意要注意java.util.Observablejava.util.Observable实现上所带来的一些问题实现上所带来的一些问题设计模式详解设计模式详解装饰者模式装饰者模式:装饰者模式可以动态地将责任附加到对象上,若要扩展装饰者模式可以动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。功能,装饰者提供了比继承更有弹性的替代方案。设计模式详解设计模式详解装饰者模式要点装饰者模式要点:装饰者模式也可以让我们扩展被装饰者的行为。装饰者模式也可以让我们扩展被装饰者的行为。装饰者模式意味着一群装饰者类,这些类用来包装具体组件。装饰者模式意味着一群装饰者类,这些类用来包装具体组件。装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)。都经过接口或继承实现)。装饰者可以在被装饰者的行为前面与装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,或后面加上自己的行为,甚甚至将被装饰者的行为整个取代掉,而达到特定的目的。至将被装饰者的行为整个取代掉,而达到特定的目的。你可以用无数个装饰者包装一个组件。你可以用无数个装饰者包装一个组件。装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。体类型。装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。得很复杂。设计模式详解设计模式详解工厂方法模式工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。类是哪一个。工厂方法让类把实例化推迟到子类。设计模式详解设计模式详解工厂模式要点工厂模式要点:所有的工作都是用来封装对象的创建。所有的工作都是用来封装对象的创建。简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。可以将客户程序从具体类解耦。工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法工厂方法使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象。来创建对象。抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来抽象工厂使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中。的方法中。所有工厂模式都通过减少应用程序和具体类之间的以来促进松耦合。所有工厂模式都通过减少应用程序和具体类之间的以来促进松耦合。工厂方法允许类将实例化延迟到子类进行。工厂方法允许类将实例化延迟到子类进行。抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。抽象工厂创建相关的对象家族,而不需要依赖它们的具体类。依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象。依赖倒置原则,指导我们避免依赖具体类型,而要尽量依赖抽象。工厂是很有威力的技巧,帮助我们针对抽象编程,而不要针对具体工厂是很有威力的技巧,帮助我们针对抽象编程,而不要针对具体类编程。类编程。设计模式详解设计模式详解单件模式单件模式:确保一个类只有一个实例,并提供一个全局访问点。确保一个类只有一个实例,并提供一个全局访问点。设计模式详解设计模式详解单件模式要点单件模式要点:单件模式确保程序中一个类最多只有一个实例。单件模式确保程序中一个类最多只有一个实例。单件模式也提供访问这个实例的全局点。单件模式也提供访问这个实例的全局点。在在javajava中实现单件模式需要私有的构造器、一个静态方法,一个静中实现单件模式需要私有的构造器、一个静态方法,一个静态变量。态变量。确定在性能和资源上的限制,然后小心地选择适当的方案来实现单确定在性能和资源上的限制,然后小心地选择适当的方案来实现单件,以解决多线程的问题。件,以解决多线程的问题。如果不是采用如果不是采用jdk5jdk5的的jvm,jvm,双重检查加锁实现会失效。双重检查加锁实现会失效。小心,你如果使用多个类加载器,可能导致单件失效而产生多个实小心,你如果使用多个类加载器,可能导致单件失效而产生多个实例。例。如果使用如果使用JVM1.2JVM1.2或之前的版本,你必须建立单件注册表,以免垃圾或之前的版本,你必须建立单件注册表,以免垃圾收集器将单件回收。收集器将单件回收。设计模式详解设计模式详解命令模式命令模式:将将“请求请求”封装成对象,以便使用不同的请求、队列或封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象者日志来参数化其他对象,支持可撤消的操作。支持可撤消的操作。设计模式详解设计模式详解命令模式要点命令模式要点:命令模式将发出请求的对象和执行请求的对象解耦。命令模式将发出请求的对象和执行请求的对象解耦。被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接受者和一个或一组动作。受者和一个或一组动作。调用者通过调用命令对象的调用者通过调用命令对象的execute()execute()发出请求,着会使得接收者的发出请求,着会使得接收者的动作被调用。动作被调用。调用者可以接受命令当做参数,甚至在运行时动态地进行。调用者可以接受命令当做参数,甚至在运行时动态地进行。命令可以支持撤消,做法是实现一个命令可以支持撤消,做法是实现一个undo()undo()方法来回到方法来回到execute()execute()被被执行前的状态。执行前的状态。宏命令是命令的一种简单的延伸,允许调用多个命令。宏方法也可宏命令是命令的一种简单的延伸,允许调用多个命令。宏方法也可以支持撤消。以支持撤消。实际操作时,很常见使用实际操作时,很常见使用“聪明聪明”命令对象,也就是直接实现了请命令对象,也就是直接实现了请求,而不是将工作委托给接收者。求,而不是将工作委托给接收者。命令也可以用来实现日志和事务系统。命令也可以用来实现日志和事务系统。设计模式详解设计模式详解适配器模式适配器模式:将一个类的接口,转换成客户期望的另一个接口。适配将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间。器让原来接口不兼容的类可以合作无间。设计模式详解设计模式详解适配器模式要点适配器模式要点:当需要使用一个现有的类而其接口并不适合你的当需要使用一个现有的类而其接口并不适合你的要求时,就使用适配器要求时,就使用适配器适配器改变接口以符合客户的期望。适配器改变接口以符合客户的期望。实现一个适配器可能需要一番功夫,也可能不费实现一个适配器可能需要一番功夫,也可能不费功夫,视目标接口的大小与复杂度而定功夫,视目标接口的大小与复杂度而定适配器模式有两种实现形式,对象适配器和类适适配器模式有两种实现形式,对象适配器和类适配器。类适配器需要用到多重继承配器。类适配器需要用到多重继承。设计模式详解设计模式详解外观模式外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。外观定义了一个高层接口,让子系统更容易使用。设计模式详解设计模式详解外观模式要点外观模式要点:当需要简化并统一一个很大的接口或者一群复杂当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观。的接口时,使用外观。外观将客户从一个复杂的子系统中解耦。简化交外观将客户从一个复杂的子系统中解耦。简化交互接口。互接口。实现一个外观,需要将子系统组合进外观中,然实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统执行。后将工作委托给子系统执行。设计模式详解设计模式详解模板方法模式模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。情况下,重新定义算法中的某些步骤。设计模式详解设计模式详解模板方法模式要点模板方法模式要点:“模板方法模板方法”定义了算法的步骤,把这些步骤的实现延迟到子类。定义了算法的步骤,把这些步骤的实现延迟到子类。模板方法模式为我们提供了一种代码复用的重要技巧。模板方法模式为我们提供了一种代码复用的重要技巧。模板方法的抽象类可以定义具体方法、抽象方法和钩子。模板方法的抽象类可以定义具体方法、抽象方法和钩子。抽象方法由子类实现。抽象方法由子类实现。钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。类可以选择要不要去覆盖它。为了防止子类改变模板方法,可以将模板方法声明为为了防止子类改变模板方法,可以将模板方法声明为finalfinal。将决策权放在高层模块中,以便决定如何以及何时调用底层模块。将决策权放在高层模块中,以便决定如何以及何时调用底层模块。你将在真实世界代码中看到模板方法模式的许多变体,不要期待他你将在真实世界代码中看到模板方法模式的许多变体,不要期待他们全是一眼就可以被你认出的。们全是一眼就可以被你认出的。策略模式和模板方法都是封装算法,一个用组合,一个用继承。策略模式和模板方法都是封装算法,一个用组合,一个用继承。工厂方法是模板方法的一个特殊版本。工厂方法是模板方法的一个特殊版本。设计模式详解设计模式详解迭代器模式迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而提供一种方法顺序访问一个聚合对象中的各个元素,而有不暴露其内部的表示有不暴露其内部的表示.