Decorator装饰模式

装饰模式别名也叫包装器,国外设计模式大师组合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("国荣");
	}
	
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值