其中关于模式的描述来自:《Head First 设计模式》,括号内某些为个人理解,不代表正确
[quote="OO设计原则"]封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
为交互对象之间松耦合设计而努力
类应该对扩展开放,对修改关闭
依赖抽象,不要依赖具体类
只和“朋友”交谈
别找我,我会找你
类应该只有一个改变的理由
[/quote]
[quote="模式"]模式是在某情境(context)下,针对某问题的某种解决方案。
[b]情境[/b]就是应用某个模式的情况。这应该是会不断出现的情况。
[b]问题[/b]就是你想在某情境下达到的目标,但也可以是某情境下的约束。
[b]解决方案[/b]就是你所追求的:一个通用的设计,来解决约束,达到目标。
[/quote]
[b]策略模式:[/b]
定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
(好像现在常用的DAO,Service就是这个模式)
[b]观察者模式:[/b]
在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
(在Java中已经提供了java.util.Observable和java.util.Observer来实现,也可以通过自己实现。暂时还没碰到类似的应用场景)
[b]装饰模式:[/b]
动态的将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。
(可以这样理解:一杯纯的咖啡,现在需要加牛奶,那么牛奶就是装饰了咖啡)
[b]工厂模式(Factory):[/b]
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
所有的工厂都是用来封装对象的创建。
简单工厂:不是真正的设计模式,但不失为一个简单的方法,可以将客户程序从具体类解耦。
工厂方法:使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象。
抽象工厂:使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中,也就是抽象工厂的实现类中。
(分为抽象工厂和简单工厂模式,简单工厂模式主要可以对代码进行解耦,抽象工厂就是定义一个工厂接口,然后由不同的工厂去实现,工厂方法就是在某个逻辑类中有类似createObject,但是这个createObject由具体子类去实现)
[b]单例模式(Singleton):[/b]
确保一个类只有一个实例,并提供全局访问点。在Java中实现单例模式需要私有的构造器,一个静态方法和一个静态变量。
(主要是要处理好多线程创建实例的问题,可应用于系统配置之类的地方)
[b]命令模式(Command):[/b]
将请求封装成对象,这样可以让你使用不同的请求,列队,或者日志请求来参数化其他对象,命令模式也可以支持撤销操作。
(主要是定义一个Command接口,然后有众多的Command实现,而CommandExecuter只负责调用Command实例的execute方法,从而不用管具体实现,达到扩展开放,修改封闭。可用于列队任务等)
[b]适配器模式(Adapter):[/b]
将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。
(当需要使用一个现有的类而其接口并不符合你的需求时,就使用适配器。适配器改变接口以符合客户的期望)
[b]外观模式(Facade):[/b]
提供了一个统一的接口,用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用。
在方法中只应该调用:该对象本身;被当作方法参数而传递进来的对象;此方法所创建或实例化的任何对象;该对象的任何组件。
(当需要简化并统一一个很大的接口或者一群复杂接口时,使用外观。外观将客户从一个复杂的子系统中解耦)
[quote]适配器将一个对象包装起来以改变其接口;
装饰者将一个对象包装起来以增加新的行为和责任;
而外观将一群对象“包装”起来以简化其接口[/quote]
[b]模板方法模式:[/b]
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法定义了算法的步骤,把这些步骤的实现延迟到子类。
模板方法的抽象类可以定义具体的方法、抽象方法和钩子。
[b]迭代器模式:[/b]
提供一种方式顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
把游走的任务放在迭代器上,而不是聚合上,这样简化了聚合的接口和实现,也让责任各得其所。
迭代器允许访问聚合元素,而不需要暴露它的内部结构。
迭代器将便利聚合的工作封装进一个对象中。
当使用迭代器的时候,我们依赖聚合提供遍历。
迭代器提供了一个通用的接口,让我们遍历聚合的项,当我们编码使用聚合的项时,就可以使用多态机制。
(如,有两个类,其中使用了不同的集合类型存储了数据,如果针对具体集合类型编写代码会造成大量冗余代码,提供一个统一的转换为迭代的接口,可使代码依赖性降低)
[b]组合模式:[/b]
允许你将对象组成树形结构来表示“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象和对象组合。
组合模式提供一个结构,可同时包容个别对象和组合对象。
组合模式允许客户对个别对象以及组合对象一视同仁。
组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点。
(这个模式也就是建立树形的对象组,但总觉得其概念上有点问题。)
[b]状态模式:[/b]
允许对象在内部状态改变时改变它的行为,对象看起来好像改变了它的类。
状态模式允许一个对象基于内部状态而拥有不同的行为。
[b]代理模式:[/b]
为另一个对象提供一个替身或占位符以控制对这个对象的访问。
使用代理模式创建代表(representative)对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。
代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种。
远程代理:管理客户和远程对象之间的交互。
虚拟代理:控制访问实例开销大的对象。
保护代理:基于调用者控制对对象方法的访问。
[b]复合模式:[/b]
符合模式结合两个或两个以上的模式,组成一个解决方案,解决一再发生的一般性问题。
MVC是符合模式,结合了观察者模式、策略模式和组合模式。
模型使用观察者模式,以便观察者更新,同时保持两者之间的解耦。
控制器是视图的策略,视图可以使用不同的控制器实现,得到不同的行为。
视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板、框架和按钮。
Model 2是MVC在Web上的应用。
在Model 2中,控制器实现成Servlet,而JSP/HTML实现视图。
[quote="OO设计原则"]封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
为交互对象之间松耦合设计而努力
类应该对扩展开放,对修改关闭
依赖抽象,不要依赖具体类
只和“朋友”交谈
别找我,我会找你
类应该只有一个改变的理由
[/quote]
[quote="模式"]模式是在某情境(context)下,针对某问题的某种解决方案。
[b]情境[/b]就是应用某个模式的情况。这应该是会不断出现的情况。
[b]问题[/b]就是你想在某情境下达到的目标,但也可以是某情境下的约束。
[b]解决方案[/b]就是你所追求的:一个通用的设计,来解决约束,达到目标。
[/quote]
[b]策略模式:[/b]
定义算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
(好像现在常用的DAO,Service就是这个模式)
[b]观察者模式:[/b]
在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
(在Java中已经提供了java.util.Observable和java.util.Observer来实现,也可以通过自己实现。暂时还没碰到类似的应用场景)
[b]装饰模式:[/b]
动态的将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。
(可以这样理解:一杯纯的咖啡,现在需要加牛奶,那么牛奶就是装饰了咖啡)
[b]工厂模式(Factory):[/b]
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
所有的工厂都是用来封装对象的创建。
简单工厂:不是真正的设计模式,但不失为一个简单的方法,可以将客户程序从具体类解耦。
工厂方法:使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象。
抽象工厂:使用对象组合,对象的创建被实现在工厂接口所暴露出来的方法中,也就是抽象工厂的实现类中。
(分为抽象工厂和简单工厂模式,简单工厂模式主要可以对代码进行解耦,抽象工厂就是定义一个工厂接口,然后由不同的工厂去实现,工厂方法就是在某个逻辑类中有类似createObject,但是这个createObject由具体子类去实现)
[b]单例模式(Singleton):[/b]
确保一个类只有一个实例,并提供全局访问点。在Java中实现单例模式需要私有的构造器,一个静态方法和一个静态变量。
(主要是要处理好多线程创建实例的问题,可应用于系统配置之类的地方)
[b]命令模式(Command):[/b]
将请求封装成对象,这样可以让你使用不同的请求,列队,或者日志请求来参数化其他对象,命令模式也可以支持撤销操作。
(主要是定义一个Command接口,然后有众多的Command实现,而CommandExecuter只负责调用Command实例的execute方法,从而不用管具体实现,达到扩展开放,修改封闭。可用于列队任务等)
[b]适配器模式(Adapter):[/b]
将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。
(当需要使用一个现有的类而其接口并不符合你的需求时,就使用适配器。适配器改变接口以符合客户的期望)
[b]外观模式(Facade):[/b]
提供了一个统一的接口,用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用。
在方法中只应该调用:该对象本身;被当作方法参数而传递进来的对象;此方法所创建或实例化的任何对象;该对象的任何组件。
(当需要简化并统一一个很大的接口或者一群复杂接口时,使用外观。外观将客户从一个复杂的子系统中解耦)
[quote]适配器将一个对象包装起来以改变其接口;
装饰者将一个对象包装起来以增加新的行为和责任;
而外观将一群对象“包装”起来以简化其接口[/quote]
[b]模板方法模式:[/b]
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模板方法定义了算法的步骤,把这些步骤的实现延迟到子类。
模板方法的抽象类可以定义具体的方法、抽象方法和钩子。
[b]迭代器模式:[/b]
提供一种方式顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
把游走的任务放在迭代器上,而不是聚合上,这样简化了聚合的接口和实现,也让责任各得其所。
迭代器允许访问聚合元素,而不需要暴露它的内部结构。
迭代器将便利聚合的工作封装进一个对象中。
当使用迭代器的时候,我们依赖聚合提供遍历。
迭代器提供了一个通用的接口,让我们遍历聚合的项,当我们编码使用聚合的项时,就可以使用多态机制。
(如,有两个类,其中使用了不同的集合类型存储了数据,如果针对具体集合类型编写代码会造成大量冗余代码,提供一个统一的转换为迭代的接口,可使代码依赖性降低)
[b]组合模式:[/b]
允许你将对象组成树形结构来表示“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象和对象组合。
组合模式提供一个结构,可同时包容个别对象和组合对象。
组合模式允许客户对个别对象以及组合对象一视同仁。
组合结构内的任意对象称为组件,组件可以是组合,也可以是叶节点。
(这个模式也就是建立树形的对象组,但总觉得其概念上有点问题。)
[b]状态模式:[/b]
允许对象在内部状态改变时改变它的行为,对象看起来好像改变了它的类。
状态模式允许一个对象基于内部状态而拥有不同的行为。
[b]代理模式:[/b]
为另一个对象提供一个替身或占位符以控制对这个对象的访问。
使用代理模式创建代表(representative)对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。
代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种。
远程代理:管理客户和远程对象之间的交互。
虚拟代理:控制访问实例开销大的对象。
保护代理:基于调用者控制对对象方法的访问。
[b]复合模式:[/b]
符合模式结合两个或两个以上的模式,组成一个解决方案,解决一再发生的一般性问题。
MVC是符合模式,结合了观察者模式、策略模式和组合模式。
模型使用观察者模式,以便观察者更新,同时保持两者之间的解耦。
控制器是视图的策略,视图可以使用不同的控制器实现,得到不同的行为。
视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板、框架和按钮。
Model 2是MVC在Web上的应用。
在Model 2中,控制器实现成Servlet,而JSP/HTML实现视图。