黑马程序员技术交流社区

标题: 什么是装饰设计模式 [打印本页]

作者: 班志国    时间: 2012-10-13 21:17
标题: 什么是装饰设计模式
本帖最后由 班志国 于 2012-10-21 08:51 编辑

什么是装饰设计模式
作者: 赵永康    时间: 2012-10-13 21:52
应该就是为了增强每一个类的功能而产生的一种新类吧,应该就是将一个需要被增强的类当做参数传递给一个新类,然后再创建对象的时候,就有了原有被装饰的类的功能,然后在装饰类中再增强扩展其方法就可以了!!回答的不对,请楼主留言,我再请教别人的见解!!
作者: 徐梦侠    时间: 2012-10-13 21:56
装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。
毕老师有个装饰设计模式经典的例子,增强吃饭功能。

作者: cehkongfu    时间: 2012-10-13 22:53
装饰设计模式:
1、定义及作用
该模式以对客户端透明的方式扩展对象的功能。
2、涉及角色
抽象构件角色:定义一个抽象接口,来规范准备附加功能的类。
具体构件角色:将要被附加功能的类,实现抽象构件角色接口。
抽象装饰者角色:持有对具体构件角色的引用并定义与抽象构件角色一致的接口。
具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外功能。
3、优缺点
优点:1)提供比继承更多的灵活性 2)使用不同的装饰组合可以创造出不同行为的组合 3)需要的类的数目减少
缺点:1)灵活性带来比较大的出错性 2)产生更多的对象,给查错带来困难
作者: 黄小贝    时间: 2012-10-13 23:30
三言两语讲不清楚,想学设计模式,我见过最好的书是《head first 设计模式》

看了后知道大概是什么意思了,去找一些成熟的代码看,比如JDK源码,spring源码~

JDK中典型的装饰者模式应用是java I/O


作者: 方志亮    时间: 2012-10-13 23:35
给你个有意思的解释:(好东西哦)
DECORATOR—Mary过完轮到Sarly过生日,还是不要叫她自己挑了,不然这个月伙食费肯定玩完,拿出我去年在华山顶上照的照片,在背面写上“最好的的礼物,就是爱你的Fita”,再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦),再找隔壁搞美术设计的Mike设计了一个漂亮的盒子装起来……,我们都是Decorator,最终都在修饰我这个人呀,怎么样,看懂了吗?

装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

Java的23种设计模式的有趣见解.zip

7.15 KB, 下载次数: 171


作者: 杨静    时间: 2012-10-14 09:12
装饰器模式使用分层对象来动态地向单个对象中添加责任。某些事物是可装饰的,可以通过将其他类包装在这个可装饰对象的周围,来将功能分层。
import java.util.Date;

class Basic
{
        private String value;
        public void set(String val){
                value = val;
        }
        public String get(){return value;}
        }

class Decorator extends Basic{
        protected Basic basic;
        public Decorator(Basic baisic){
                this.basic =basic;
        }
        public void set(String val){
                basic.set(val);
        }
        public String get(){return basic.get();}
}

class TimeStamped extends Decorator{
        private final long timeStamp;
        public TimeStamped(Basic basic){
                super(basic);
                timeStamp= new Date().getTime();
        }
        public long getStamp(){return timeStamp;}
}
        class SerialNumbered extends Decorator {
        private  long counter =1;
        private final long serialNumber = counter++;
        public SerialNumbered(Basic basic){super(basic);}
        public long getSerialNumber(){return serialNumber;}
        }


public class Decoration {
        public static void main(String[] args) {
         TimeStamped t = new TimeStamped(new Basic());
         TimeStamped t2 = new TimeStamped(new SerialNumbered( new Basic()));
         System.out.println(t2.getStamp());
//而t2.getSerialNumber();是不可行的;
         SerialNumbered s = new SerialNumbered(new Basic());
         SerialNumbered s2 = new SerialNumbered( new TimeStamped(new Basic()));
         System.out.println(s2.getSerialNumber());

        }

}

使用装饰器所产生的对象类型是最后被装饰的类型。也就是说,尽管可以添加多个层,但是最后一层才是实际的类型,因此只有最后一层的方法时可视的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2