一,策略模式java
1, 定义算法
定义算法族,分别封装起来,让它们之间能够相互替换,此模式让算法的变化独立于使用算法的客户。编程
2, 要点设计模式
A. 知道OO基础,并不足以让你设计出良好的OO系统。缓存
B. 良好的OO设计必须具有能够复用、可扩充、可维护三个特性。安全
C. 模式可让咱们建造出具备良好OO设计质量的系统。多线程
D.模式被认为是历经验证的OO设计经验。app
E. 模式不是代码,而是针对设计问题的通用解决方案。你可把它们应用到特定的应用中。性能
F. 模式不是被发明,而是被发现。编码
G. 大多数的模式和原则,都着眼于软件变化的主题。
H.大多数的模式都容许系统局部改变独立于其余部分。
I. 咱们常把系统中会变化的部分抽出来封装。
J. 模式让开发人员之间有共享的语言,可以最大化沟通的价值。
二,观察者模式
1, 定义
在对象中定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
2, 要点
A. 观察者模式定义了对象之间一对多的关系。
B. 主题(也就是可观察者)用一个共同的接口来更新观察者
C. 观察者和可观察者之间用松耦合方式结合(loosecoupling),可观察者不知道观察者的细节,只知道观察者实现了观察者接口。
D.使用此模式时,你能够从被观察者出推(push)或拉(pull)数据(然而,推的方式被认为更“正确”)。
E. 有多个观察者时,不能够依赖特定的通知次序。
F. Java有多种观察者模式的实现,包括了通用的java.util.Observable。
G. 要注意java.util.Observable实现上所带来的问题。
H.若是有必需要的话,能够实现本身的Observable。
I. Swing大量使用观察者模式,许多GIUI也是如此。
J. 此模式也被应用在许多地方,例如:JavaBeans、RMI。
三,装饰者模式
1, 定义
动态的将责任附加到对象上。想要扩展功能,装饰着提供有别于继承的另外一种选择。
2, 要点
A.继承属于扩展的形式之一,但不见得时达到弹性设计的最佳方式。
B.在咱们的设计中,应该容许行为能够扩展,而无须修改现有的代码。
C.组合和委托可用于在运行时动态地加上新的行为。
D.除了继承,装饰者模式也可让咱们扩展行为。
E.装饰者模式意味着一群装饰者类,这些类用来包装具体组件。
F.装饰者类反映出被装饰者的组件类型(事实上,它们具备相同的类型,都通过接口或继承实现)。
G.装饰者能够在被装饰者的行为前面与/或后面加上本身的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。
H.你能够用无数个装饰者包装一个组件。
I.装饰者通常对组件的客户是透明的,除非客户程序依赖于组件的具体类型。
J.装饰者会致使设计中出现许多的小对象,若是过分使用会让程序变得很复杂。
四,工厂方法模式
1, 定义
定义了一个建立对象的接口,但由子类决定要实例化的类是哪个。工厂方法让类把实例化推迟到子类。
2, 要点
A.全部的工厂都是用来封装对象的建立。
B.简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,能够将客户程序从具体类解耦。
C.工厂方法使用继承,把对象的建立委托给子类,子类实现工厂方法来建立对象。
D.抽象工厂方法使用对象组合,对象的建立被实如今工厂接口所暴露出来的方法中。
E.全部工厂模式都是经过减小应用程序和具体类之间的依赖促进松耦合。
F.工厂方法容许类将实例化延迟到子类进行。
G.抽象工厂建立相关的对象家族,而不须要依赖它们的具体类。
H.依赖倒置原则,指导咱们避免依赖具体类型,而要尽可能依赖抽象。
I.工厂是颇有威力的技巧,帮助咱们针对抽象编程,而不要针对具体类编程。
五,单件模式
1, 定义
确保一个类只有一个实例,并提供一个全局访问点。
2, 要点
A.单件模式确保程序中一个类最多只有一个实例。
B.单件模式也提供访问这个实例的全局点。
C.在Java中实现单件模式须要私有化构造器,一个静态方法和一个静态变量。
D.肯定在性能和资源上的限制,而后当心地选择适当的方案来实现单件,一解决多线程的问题。
六,命令模式
1, 定义
将“请求”封装成对象,以便使用不一样的请求、队列或者日志来参数化其余对象。命令模式也支持可撤销的操做。
2, 要点
A.命令模式将发出请求的对象和执行请求的对象解耦。
B.在被解耦的二者之间是经过命令对象进行沟通的。命令对象封装了接收者和一个或一组动做。
C.调用者经过调用命令对象的execute()发出请求,这会使得接收者的动做被调用。
D.调用者能够接受命令看成参数,甚至在运行时动态的进行。
E.命令能够支持撤销,作法时实现一个undo()方法来回到execute()被执行前的状态。
F. 宏命令是命令的一种简单的延伸,容许调用多个命令。宏命令也支持撤销。
G.实际操做时,很常见使用“聪明”命令对象,也就是直接实现了请求,而不是将工做委托给接收者。
H.命令也能够用来实现日志和事务系统。
七,适配器模式和外观模式
1, 定义
A.适配器模式:将一个类的接口,转换成客户指望的其一个接口。适配器让本来不兼容的类能够合做无间。
B.外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
2, 要点
A.当须要使用一个现有的类而其接口并不符合你的须要时,就使用适配器。
B.当须要简化并统一一个很大的接口或者一群复杂的接口时,使用外观。
C.外观将客户从一个复杂的子系统中解耦。
D.实现一个适配器可能须要一番功夫,也可能不费功夫,视目标接口的大小和复杂度而定。
E.实现一个外观,须要将子系统组合进外观中,而后将工做委托给子系统执行。
F.适配器模式有两种形式,对象适配器和类适配器。类适配器须要用到多继承(Java没法实现)
G.你能够为一个子系统实现一个以上的外观
H.适配器将一个对象包装起来以改变其接口;装饰者模式将对象包装起来以增长新的行为和责任;而外观将一群对象“包装”起来以简化其接口。
八,模板方法模式
1, 定义
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法是的子类能够在不改变算法结构的状况下,从新定义算法中的某些步骤。
2, 要点
A.“模板方法”定义了算法的步骤,把这些步骤的实现延迟到子类。
B.模板方法模式为咱们提供了一种代码复用的重要技巧。
C.模板方法的抽象类能够定义具体的方法、抽象方法和钩子
D.抽象方法由子类实现
E.钩子是一种方法,它在抽象类中不作事,或者只作默认的事,子类能够选择要不要覆盖它。
F.为了防止子类改变模板方法中的算法,能够将模板方法声明为final。
G.好莱坞原则告诉咱们,将决策权放在高层组件中,以便决定如何以及什么时候调用底层模块。
H.你将在真实世界代码中看到模板方法模式的许多变体,不要期待它们全都是一眼就能够被你认出的。
I.策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
J.工厂方法是模板方法的一种特殊版本。
九,迭代器和组合模式
1, 定义
A. 迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
B. 组合模式:容许你将对象组成树形结构来表示“总体/部分”的层次结构。组合能让客户以一致的方式处理个别对象和对象组合。
2, 要点
A.迭代器容许访问聚合的元素,而不须要暴露它的内部结构。
B.迭代器将遍历聚合的工做封装进一个对象中。
C.当使用迭代器的时候,咱们依赖聚合提供遍历。
D.迭代器提供了一个通用的接口,让咱们遍历聚合的项,当咱们编码使用聚合的项时,就可使用多态机制。
E.咱们应该努力让一个类只分配一个责任。
F.组合模式提供一个结构,可同时包容个别对象和组合对象。
G.组合模式容许客户对个别对象以及组合对象一视同仁。
H.组合结构内的任意对象称为组件,组件能够是组合也能够是叶节点。
I.在实现组合模式时,有许多设计上的折衷,你要根据须要平衡透明性和安全性。
十,状态模式
1, 定义
容许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
2, 要点
A.状态模式容许一个对象基于内部状态而拥有不一样的行为。
B.和程序状态机(PSM)不一样,状态模式用类表明状态。
C.Context会将行为委托给当前状态对象。
D.经过将每一个状态封装进一个类,咱们把之后须要作的任何改变局部化了。
E.状态模式和策略模式有相同的类图,可是它们的意图不一样。
F.策略模式一般会用行为或算法来配置Context类。
G.状态模式容许Context随着状态的改变而改变行为。
H.状态转换能够由State类或Context类控制。
I.使用状态模式一般会致使设计中的类的数目大量增长。
J.状态类能够被多个Context实例共享。
十一,代理模式
1, 定义
为另外一个对象提供一个替身或占位符以访问这个对象。
2, 要点
A.代理模式为另外一个对象提供表明,以便控制客户对对象的访问,管理访问的方式由许多种。
B.远程代理管理客户和远程对象之间的交互。
C.虚拟代理控制访问实例化开销大的对象。
D.保护代理基于调用者控制对对象方法的访问。
E.代理模式有许多变体,例如:缓存代理、同步代理、防火墙代理和写入时复制代理。
F.代理在结构上相似装饰者,可是目的不一样。
G.装饰者模式为对象加上行为,而代理则是控制访问。
H.Java内置的代理支持,能够根据须要创建动态代理,并将全部调用分配到所选的处理器。
I.就和其余的包装者(wrapper)同样,代理会形成你的设计中类的数目增长。
十二,复合模式
1, 定义
复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的通常性问题。设计模式是在某情景下,针对某问题的某种解决方案