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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 电玩 中级黑马   /  2013-5-5 18:12  /  1689 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 电玩 于 2013-5-5 19:30 编辑

装饰类与继承的区别?什么时候用装饰类?什么时候用继承?(要有代码)
嘿嘿!其实我就喜欢做题。这个问题的知识点在  黑马程序员_毕向东_Java基础视频教程第19天-07-IO流(装饰和继承的区别)

答:第一要先定义装饰设计模式:
当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。装饰类通常会通过构造方法接收被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。
   如一个简单的demo 人吃饭,刚开始人穷只是普通的吃饭后来人生活好了吃饭就不一样了增强了吃饭的功能  虽然例子不是恰当 能说明问题就行

class Person  //定义一个人类
{
public void chifan()  //吃饭的方法  功能
{
System.out.println("吃饭");
}
}

class SuperPerson  //定义一个富裕后的人类  
{   
private Person p;
SuperPerson(Person p){
this.p=p;
}
public void superChifan()  //富裕后 ,吃饭的功能变强
{
System.out.println("开胃酒");     //先喝点小酒
p.chifan();                                  //再吃饭
System.out.println("甜点");      //饭后来点甜点
System.out.println("来一根");   //饭后一支烟,快活似神仙
}
}

class  PersonDemo06  //具体实现  提供更强的功能
{
public static void main(String[] args)
{
  Person p=new Person();
  SuperPerson sp=new SuperPerson(p);
  sp.superChifan();
}
}
第二,讲清继承的定义及实例。Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。比如可以分隔符先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。

class PersonA  //定义一个人类 有名字  
{
private String name;

public void setName(String newName) {
  name = newName;
}

public String getName() {
  return name;
}
}

class StudentA extends PersonA  //定义一个学生类 继承了父类 人类的 名字
{
private String department;        //自己又增加了一个属性: 学系

public void setDepartment(String newDepartment) {
  department = newDepartment;
}

public String getDepartment() {
  return department;
}
}

class C1
{
public static void main(String args[]) {
  StudentA s1 = new StudentA();
  s1.setName("张三");        //getName() 是父类方法,继承后直接使用
  s1.setDepartment("计算机系");
  System.out.println("你好,我是" + s1.getName());
  System.out.println("我是" + s1.getDepartment() + "的学生");
}
}
第三,再水到渠成的讲装饰类与继承的区别。
以定义MyReader为例。

MyReader //专门用于读取数据的类。
   |--MyTextReader   //读取文本的类
       |--MyBufferTextReader  下面有读取文本缓冲区的类
   |--MyMediaReader    //读取影音文件的类 ,子类是读取影音缓冲区的类
       |--MyBufferMediaReader
   |--MyDateReader   //查看数据的类,子类是查看数据时缓冲区的类
       |--MyBufferDateReader


class MyBufferReader
{
MyBufferReader(MyTextReader text){

}
MyBufferReader(MyMediaReader media){
}
MyBufferReader(MyDateReader date){
}
}
上面这个类扩展性很差。
找到其参数的共同类型。通过多态的形式,可以提高扩展性。
class MyBufferReader extends MyReader  //使用继承方法
{
   MyBufferReader(MyReader r){
   
   }
}

MyReader//专门用于读取数据的类。
   |--MyTextReader
   |--MyMediaReader
   |--MyDateReader
   |--MyBufferReader

装饰模式比继承要灵活,避免了继承体系的臃肿。而且降低了类与类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。所以装饰类和被装饰类通常都是属于一个体系中的。
      
装饰是构造函数参数传递进行增强
如果为了某个功能而产生子类(继承)那么那个体系是非常臃肿的

例如:你有个对象有个功能 是在N年前建立的,如今你觉得功能不够用了 写个类把对象传进来就可以解决问题了 如果这个功能写错了 我就把自己写的功能去掉又不影响以前的功能灵活性相当强的。
2,什么是泛型?什么时候用?怎么用?(要有代码)
这个问题的知识点在 黑马程序员_毕向东_Java基础视频教程第15天-07-集合框架(泛型使用)   

泛型:JDK1.5版本以后出现新特性,用于解决安全问题,是一个类型安全机制。
好处:
1.将运行时期出现的问题ClassCastException,转移到了编译时期。
  方便程序员解决问题,让运行时期出现的问题减少,安全。
2.避免了强制转换麻烦。

泛型格式:通过<>来定义要操作的引用数据类型
在使用java提供的对象时,什么时候写泛型呢?
通常在集合框架中很常见。
只要见到<>就要定义泛型。
其实<>就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

泛型类.什么时候定义泛型类?当类中要操作的引用数据类型不确定的时候,
                 早期定义Object来完成扩展。现在定义泛型来完成扩展。




4 个回复

倒序浏览
这个不用领取,回答完以压缩包形式回复就可以,权限设置为版主可见
回复 使用道具 举报
本帖最后由 刘学明    于 2013-5-5 18:41 编辑

什么是装饰设计模式:

当想要对已有的对象进行功能增强时,
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。


装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。

如毕老师视频中讲解到的例子:人吃饭,刚开始人穷只是普通的吃饭  人生活好了吃饭就不一样了增强了吃饭的功能。
看代码:
  1. //穷的时候吃饭简简单单的吃饭
  2. class Person
  3. {
  4.         public void chiFan(){
  5.         
  6.                 System.out.println("吃饭");
  7.         }
  8. }

  9. //富裕后吃饭 吃饭前来杯酒吃饭后来根烟 但是这中间的过程还是有吃饭
  10. class SuperPerson
  11. {
  12.         private Person p;
  13.         public SuperPerson(Person p){
  14.         
  15.                 this.p=p;
  16.         }

  17.         public void superChiFan(){
  18.                 //吃饭前来杯开胃酒增加食量
  19.                 System.out.println("开胃酒");
  20.                 p.chiFan();
  21.                 //吃完饭后来根烟
  22.                 System.out.println("来根烟");
  23.         }

  24. }
  25. public class PersonDemo
  26. {        public static void main(String args[]){
  27.         Person p=new Person();

  28.         SuperPerson sp= new SuperPerson(p);

  29.         sp.superChiFan();
  30.         }
  31. }

  32. 当继承类与被继承类有一定的关系时 才使用继承。
  33. 当装饰类具备的功能和已有类属于同一体系 即没有什么关系时,只是功能增强时,用装饰类。

复制代码
回复 使用道具 举报
哈哈,老哥,领任务是我发的第一帖,第二贴,第三贴。老伍误导你了
你的回答是汪磊版主的每天两题,要按磊磊要求的来。
我帮你把标题改下
回复 使用道具 举报
........................,我还以为是汪版主发的标准答案呢,O(∩_∩)O~,不过顶个。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马