liuqiang5151

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  0 Posts :: 23 Stories :: 1 Comments :: 0 Trackbacks
      在OO中,继承可以达到代码复用的目的。但是滥用继承却会使代码具有一定的耦合性。究竟继承应该怎样用,什么时候用,装饰器模式给出了一个很好的例子。
     废话少说,举个例子先。就举个上帝造人的例子吧,首先创建一个Human的基类。
public abstract class Human {
    
final void create() 
{
        System.out.println(
"create a person"
);
    }

    
protected abstract void doSkill(); 
}
这里有一个抽象方法,并且定义了一个final方法,这就意味着子类不能继承这个方法,而必须重写doSkill方法,doSkill方法到底做什么用一会再探讨。现在我们只知道当实例化一个Human之后,一个person就成型了。下面让我们分别写两个子类。
public class Man extends Human {
    @Override
    
protected void doSkill() {
        
// TODO Auto-generated method stub
        System.out.println("Im a man");
    }

}

public class Woman extends Human {
    @Override
    
protected void doSkill() {
        
// TODO Auto-generated method stub
        System.out.println("Im a woman");
    }

}

最基本的,男人和女人。人是造好了,要让他们学东西了。下面就引出了最关键的一个类,装饰器类。
public abstract class DecratorSkill extends Human {   
    
protected void pri() {
        System.out.println(
"im skill");
    }

}
是一个描述技能的类,要装饰到人的身上,给他们赋予技能。
public class Eye extends DecratorSkill {
    Human skill;
    
public EagleSkill(Human skill) {
        
this.skill = skill;
    }

    
    @Override
    
protected void doSkill() {
        
// TODO Auto-generated method stub
        skill.doSkill();
        System.out.println(
"eye");
    }

}

眼睛的类,能看东西。
public class Ear extends DecratorSkill {
    Human skill;
    
public WolfSkill(Human skill) {
        
this.skill = skill;
    }

    
    @Override
    
protected void doSkill() {
        
// TODO Auto-generated method stub
        skill.doSkill();
        System.out.println(
"ear");
    }

}


听东西。
好了,主要类都写完了,下面连上测一下
public class Test {
    
public static void main(String[] args) {
        
// TODO Auto-generated method stub
        Human role = new Man();
        role 
= new Ear(new Eye(role));
        role.create();
        role.doSkill();
    }


}

打印出
create a person
Im a man
eye
ear
让我们来看一下DecratorSkill这个类,构造函数里面传进来一个Human类的子类的引用,保存起来,当调用doSkill方法的时候,根据多态性调用相应的doSkill方法
再累加上当前类的技能,也就是println出来的那句话,依次类推一直返到最外层,这样最外层的引用当调用doSkill方法的时候就会逐个打印出相应的技能。
这样在程序运行的时候动态的赋予了对象的职责,试想一下如果不这样做,我们要写多少个这样的类,现在只有Eye Ear这两个类,可以组合成一个能看到并且能听到的类,当我们再加入hand, leg,head这些类的时候可以组合成不同的技能,那简直是类爆炸。
其实在我们日常开发中,装饰器模式随处可见,java.io包就是装饰器模式的最好代表。有一个基类InputStream 下面有几个不同的子类FileInputStream ByteArrayInputStream还有一个FilterInputStream,这个类就是装饰类,像BufferedInputStream就是继承FilterInputStream这个类的,在使用的时候我们需要InputStream is = new FileInpuStream("1.txt"),这样生成了一个基本的读文件的类,现在我们需要加入带缓冲区的功能,那我们就用BufferedInputStream这个类来包装,is = new BufferedInputStream(is),就可以实现带缓冲区的功能了。
好了 今天先写这么多。
posted on 2008-05-28 18:35 刘强 阅读(249) 评论(0)  编辑  收藏 所属分类: 设计模式

只有注册用户登录后才能发表评论。


网站导航: