对一系列的算法定义,并将每个算法封装起来,并且使它们还能够相互替换。策略模式让算法独立于使用它的客户而独立变化。算法
找出应用中可能须要变化之处,把他们独立出来,不要和那些不须要变化的代码混在一块儿编程
多用组合,少用继承设计模式
针对接口编程,而不是针对实现编程spa
reference
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的全部依赖者都会收到通知并自动更新设计
为了交付对象之间的松耦合设计而努力3d
动态地将责任附加到对象上。若要拓展功能,装饰者提供了比继承更有弹性的替代方案。代理
优势调试
一、装饰者模式能够提供比继承更多的灵活性
二、能够经过一种动态的方式来扩展一个对象的功能,在运行时选择不一样的装饰器,从而实现不一样的行为。
三、经过使用不一样的具体装饰类以及这些装饰类的排列组合,能够创造出不少不一样行为的组合。可使用多个具体装饰类来装饰同一对象,获得功能更为强大的对象。
四、具体构件类与具体装饰类能够独立变化,用户能够根据须要增长新的具体构件类和具体装饰类,在使用时再对其进行组合,原有代码无须改变,符合“开闭原则”。日志
缺点code
一、会产生不少的小对象,增长了系统的复杂性
二、这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于屡次装饰的对象,调试时寻找错误可能须要逐级排查,较为烦琐。
装饰者的使用场景
一、在不影响其余对象的状况下,以动态、透明的方式给单个对象添加职责。
二、须要动态地给一个对象增长功能,这些功能也能够动态地被撤销。当不能采用继承的方式对系统进行扩充或者采用继承不利于系统扩展和维护时。
将请求封装成对象,以便使用不一样的请求,队列或日志才参数化其余对象
提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示
单一责任,一个类应该只有一个引发变化的缘由。
内聚:度量一个类或模块紧密地达到单一目的或责任。
容许讲对象组合成树形结构来表现“总体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合
容许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
这个模式将状态封装成为独立的类,并将动做委托到表明当前状态的对象
代理模式和装饰者模式的区别:
装饰者为对象添加行为 代理是控制对象的访问
一种经常使用的代理模式,对于一些占用系统资源较多或者加载时间较长的对象,能够给这些对象提供一个虚拟代理。
在真实对象建立成功以前虚拟代理扮演真实对象的替身,而当真实对象建立以后,虚拟代理将用户的请求转发给真实对象。