结构型模式之装饰模式(Decorator)
2015-01-09 10:28
162 查看
装饰模式(Decorator):也叫包装器,GOF把装饰模式定义为:动态的给对象增加一些额外的职责。可以理解为保持原有的功能不变并进行拓展。
装饰器结构:
![](https://img-blog.csdn.net/20150109102809546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamVycnlfemhhbmc0MDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Component:定义一个对象接口,可以动态的给这些对象增加职责。
ConcreteComponent:定义一个对象,可以给这个对象增加一些职责;
Decorator:维持一个指向Component对象的指针,并定义一个与Component接口一致的接口;
ConcreteDecorator:向组件添加职责。
装饰模式是为了已有功能动态的增加更多功能的一种方式。
实例:每到年底,公司都会进行员工考核,以市场部某员工为例,考察其上一年的考核排名即分数情况。
考核抽象类
员工考核类
装饰考核报表
最高考核分数装饰
排名装饰类
测试类
此次考核最高平均分:4.2,年度考核平均分:4.1
部门排名:第7
员工:jerry,部门:市场部
考核情况:平均分:3.5,年度考核分:3.6
.......
评价人:tom
优势:
通过在类中移除装饰功能,从而使其更加精简;
提供比单独的继承、组合更强大、更灵活的功能;
区别类的核心职责和装饰职责,降低了类的耦合度;
无需修改组件,即可添加面向该具体组件的具体的装饰功能。
应用场合:
当程序需要扩展现有类的功能或职责时;
当类需要添加灵活性较高的功能时;
单独使用继承或组合存在维护复杂、代码过多等问题时;
Struts与装饰模式
在Struts框架中,继承于ActionConfig的ActionMapping使业务逻辑分为几种类型,当某一个Http请求过来时, ActionServlet将于ActionMapping的相关目录中通过path属性方便快捷的实现所需要内容的目标。
并且,“全部的ActionMapping对象都存放在一个集合中,为了更好的使用Action,ActionMapping对象被用来作为Action对象的修饰符,它将一个或者多个URL交给Action,同时根据哪个URL被调用来传递不同配置信息给Action。即ActionMapping可以动态的赋予一个特定的Action对象一些附加的要求和新功能,这些就是装饰模式的要求。该设计模式相对于子类话方法扩展功能而言,具有更高的灵活性。”
装饰器结构:
Component:定义一个对象接口,可以动态的给这些对象增加职责。
ConcreteComponent:定义一个对象,可以给这个对象增加一些职责;
Decorator:维持一个指向Component对象的指针,并定义一个与Component接口一致的接口;
ConcreteDecorator:向组件添加职责。
装饰模式是为了已有功能动态的增加更多功能的一种方式。
实例:每到年底,公司都会进行员工考核,以市场部某员工为例,考察其上一年的考核排名即分数情况。
考核抽象类
<span style="font-size:18px;">public abstract class ExamineeRecord { public abstract String record(); public abstract String signature(String name); }</span>
员工考核类
<span style="font-size:18px;">package com.test.decorator; public class YearExamineeRecord extends ExamineeRecord { public String record() { String a1 ="员工:jerry,部门:市场部"; String a2="考核情况:平均分:3.5,年度考核分:3.6"; String a3="......."; System.out.println("员工:jerry,部门:市场部"); System.out.println("考核情况:平均分:3.5,年度考核分:3.6"); System.out.println("......."); return a1+a2+a3; } public String signature(String name) { String a="评价人:"; System.out.println(a+name); return a+name; } }</span>
装饰考核报表
<span style="font-size:18px;">package com.test.decorator; pu 4000 blic class Decorator extends ExamineeRecord { private ExamineeRecord er; public Decorator(ExamineeRecord er) { this.er = er; } public String record() { return this.er.record(); } public String signature(String name) { return this.er.signature(name); } }</span>
最高考核分数装饰
<span style="font-size:18px;">package com.test.decorator; public class TipTopPointDecorator extends Decorator { public TipTopPointDecorator(ExamineeRecord er) { super(er); } private String reportHighRecord() { String a="此次考核最高平均分:4.2,年度考核平均分:4.1"; System.out.println("此次考核最高平均分:4.2,年度考核平均分:4.1"); return a; } public String record() { String a=this.reportHighRecord(); String b =super.record(); return a+b; } }</span>
排名装饰类
<span style="font-size:18px;">package com.test.decorator; public class OrderDecorator extends Decorator { public OrderDecorator(ExamineeRecord er) { super(er); } public String recordOrder() { String a="部门排名:第7"; System.out.println("部门排名:第7"); return a; } public String record() { String a =this.recordOrder(); String b =super.record(); return a+b; } }</span>
测试类
<span style="font-size:18px;">package com.test.decorator; public class TestDecorator { public static void main(String[] args) { ExamineeRecord er; er=new YearExamineeRecord(); er=new OrderDecorator(er); er=new TipTopPointDecorator(er); er.record(); er.signature("tom"); } } </span>测试结果:
此次考核最高平均分:4.2,年度考核平均分:4.1
部门排名:第7
员工:jerry,部门:市场部
考核情况:平均分:3.5,年度考核分:3.6
.......
评价人:tom
优势:
通过在类中移除装饰功能,从而使其更加精简;
提供比单独的继承、组合更强大、更灵活的功能;
区别类的核心职责和装饰职责,降低了类的耦合度;
无需修改组件,即可添加面向该具体组件的具体的装饰功能。
应用场合:
当程序需要扩展现有类的功能或职责时;
当类需要添加灵活性较高的功能时;
单独使用继承或组合存在维护复杂、代码过多等问题时;
Struts与装饰模式
在Struts框架中,继承于ActionConfig的ActionMapping使业务逻辑分为几种类型,当某一个Http请求过来时, ActionServlet将于ActionMapping的相关目录中通过path属性方便快捷的实现所需要内容的目标。
并且,“全部的ActionMapping对象都存放在一个集合中,为了更好的使用Action,ActionMapping对象被用来作为Action对象的修饰符,它将一个或者多个URL交给Action,同时根据哪个URL被调用来传递不同配置信息给Action。即ActionMapping可以动态的赋予一个特定的Action对象一些附加的要求和新功能,这些就是装饰模式的要求。该设计模式相对于子类话方法扩展功能而言,具有更高的灵活性。”
相关文章推荐
- [导入]C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式).zip(9.84 MB)
- 设计模式中结构型模式(四)装饰模式(Decorator)
- C#面向对象设计模式第十讲:Decorator 装饰模式(结构型模式)
- 设计模式(八)装饰器模式Decorator(结构型)
- C#面向对象设计模式纵横谈 学习笔记10 Decorator 装饰(结构型模式)
- 结构型模式:Decorator 装饰模式
- 面向对象设计模式之Decorator装饰模式(结构型)
- C#面向对象设计模式纵横谈 笔记10 Decorator 装饰(结构型模式)
- 设计模式(八)装饰器模式Decorator(结构型)
- Decorator 装饰模式(结构型模式)
- Decorator装饰(结构型模式)
- C#面向对象设计模式学习笔记(9) - Decorator 装饰模式(结构型模式)
- 面向对象设计模式之Decorator装饰模式(结构型)
- (第Ⅲ部分 结构型模式篇) 第9章 装饰模式(Decorator Pattern)
- 结构型设计模式---Decorator模式(装饰模式)
- 十二.结构型设计模式——Decorator Patten(装饰模式)
- (第Ⅲ部分 结构型模式篇) 第9章 装饰模式(Decorator Pattern)
- 设计模式(八)装饰器模式Decorator(结构型)
- (第Ⅲ部分 结构型模式篇) 第9章 装饰模式(Decorator Pattern)
- 结构型模式(三):Decorator ( 装饰模式 )