装饰模式别名也叫包装器,国外设计模式大师组合GOF把装饰模式定义为 “动态地给对象添加一些职责,就是其功能而言”。装饰模式比生成子类更灵活
动态地给对象添加一些职责,可以理解问保持原有功能不变进行扩展
看下图
Concreteconmonent:定义一个对象,可以给这个对象动态地添加职责
Decorator:维持一个指向Compnonent对象指针,并定义一个与Component接口一致的接口
ConreteDecorator:向组件添加职责
示例1
举例来说明这个模式,比如,一家公司的行政助理打印word与pdf的文件。
用户即Component,行政助理即ConcreteCompnonent打印的抽象类即Decorator,继承与于用户类(上图中的用户别名又成为其属性之一)word、pdf即ConcreteDecorator
装饰具备以下优势
1.通过类中移除装饰功能,从而使其更加精简
2.提供比单独的继承,组合更强大,更灵活的功能
3.区别类的核心职责与装饰,降低了程序的耦合度
4.无须修改组件即可添加
装饰模式应用的时机
1.当程序需要扩展现有类的功能时
2.当对象需要添加灵活性较高的功能时
3.单独使用继承或组合存在维护复杂、代码过多等问题时
Struts与装饰模式
在Struts框架中,继承与ActionConfig的ActionMapping,使业务逻辑分为几种类型,当某一个HTTP请求到来的时候,ActionServlet将于、ActionMapping的相关目录中通过path属性方便快捷的实现搜索所需内容之目标.并且全部的ActionMapping、对象都是存放到一个集合中,为了更好地使用ActionMapping可以动态赋予一个特定的Action对象一些附加的心功能,这些就是装饰模式的要求,该设计模式先对与类化方法扩展功能而言,具有更高的灵活性。
代码示例
员工考核排名与分数设计
代码
package model.decorator;
/*
* 考核抽象类
* 考核报告Componet定义一个对象接口,可以动态的给这些对象添加职责
*/
public abstract class ExamineeRecord {
//考核情况显示
public abstract String record();
//需要评价人签名
public abstract String signature(String name);
}
package model.decorator;
/*
* 维持一个指向Component对象指针,并定义一个与Component接口一致的接口
*装饰类,装饰考核报告
*/
public abstract 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);
}
}
package model.decorator;
/*
* 排名装饰
* ConcreteDecirator -向组件添加职责
*/
public class OrderDecorator extends Decorator {
public OrderDecorator(ExamineeRecord er) {
super(er);
}
//员工在部门的排名情况
public String recordOrder(){
String a = "部门排名第7....";
System.out.println(a);
return a;
}
//查看考核分数与部门的排名情况
public String record(){
super.record();
this.recordOrder();
return super.record()+this.recordOrder();
}
}
package model.decorator;
/*
* ConcreteDecorator -向组件添加职责
*/
public class TiptoPointDecorator extends Decorator {
//构造函数
public TiptoPointDecorator(ExamineeRecord er) {
super(er);
}
//部门的最高考核分数情况
private String reporHighScore(){
String a = "此次考核,最高分平均为4.2,2015年度最高考核分为4.1.";
System.out.println(a);
return a;
}
//部门最高分考核分与员工的考核分
public String record(){
this.reporHighScore();
super.record();
return this.reporHighScore()+super.record();
}
}
package model.decorator;
/*
*ConcreteComponent 定义一个对象,可以给这个对象添加一些职责
*/
public class YearExamineeRecord extends ExamineeRecord {
//员工小张的考核情况
@Override
public String record() {
String a1= "员工:小张 部门:市场";
String a2= "考核情况:平均分3.5 2015年度考核分3.6";
String a3 ="..........";
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
return a1+a2+a3;
}
//考核评价人
@Override
public String signature(String name) {
String a = "评价人:";
System.out.println(a+name);
return a+name;
}
package model.decorator;
/*
*
* 客户端程序测试
*
*/
public class Client {
public static void main(String[] args) {
//考核报告
ExamineeRecord er ;
er = new YearExamineeRecord();//员工现有考核情况
//部门考核最高分
er = new TiptoPointDecorator(er);
//考核排名
er = new OrderDecorator(er);
er.record();
er.signature("国荣");
}
}