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 {//员工小张的考核情况@Overridepublic 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;}//考核评价人@Overridepublic 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("国荣");}}

青春气贯长虹,勇敢盖过怯懦,进取压倒苟安。

Decorator装饰模式

相关文章:

你感兴趣的文章:

标签云: