A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 班志国 中级黑马   /  2012-10-13 21:17  /  2752 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 班志国 于 2012-10-21 08:51 编辑

什么是装饰设计模式

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
应该就是为了增强每一个类的功能而产生的一种新类吧,应该就是将一个需要被增强的类当做参数传递给一个新类,然后再创建对象的时候,就有了原有被装饰的类的功能,然后在装饰类中再增强扩展其方法就可以了!!回答的不对,请楼主留言,我再请教别人的见解!!

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。
毕老师有个装饰设计模式经典的例子,增强吃饭功能。
  • class Person  
  • {  
  •     void chifan()  
  •     {  
  •         System.out.println("chifan");  
  •     }  
  • }  
  •   
  • /*
  • 为了不随便改变原有的代码。
  • 还要增强chifan功能。
  • 那么就定义一个类,对原有对象进行装饰。
  • */  
  • class NewPerson  
  • {  
  •     private Person p;  
  •     NewPerson(Person p)  
  •     {  
  •         this.p = p;  
  •     }  
  •     public void newChifan()  
  •     {     
  •         System.out.println("来一杯");  
  •         p.chifan();  
  •         System.out.println("来一根");  
  •     }  
  • }  
  •   
  • class  PersonDemo  
  • {  
  •     public static void main(String[] args)   
  •     {  
  •         Person p = new Person();  
  •         p.chifan();  
  •     }  
  • }  

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 很给力!

查看全部评分

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

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

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

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

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

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

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

7.15 KB, 下载次数: 170

回复 使用道具 举报
杨静 中级黑马 2012-10-14 09:12:55
7#
装饰器模式使用分层对象来动态地向单个对象中添加责任。某些事物是可装饰的,可以通过将其他类包装在这个可装饰对象的周围,来将功能分层。
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());

        }

}

使用装饰器所产生的对象类型是最后被装饰的类型。也就是说,尽管可以添加多个层,但是最后一层才是实际的类型,因此只有最后一层的方法时可视的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马