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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李蛟龙 中级黑马   /  2012-4-14 20:46  /  1724 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

相信大家在刚开始学习java的时候对其继承特征有所了解,但是当我们学习过包装模式后,怎么分析两者的区别,或者说怎么区分应用!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

4 个回复

倒序浏览
装饰模式;
      给一个类添加一些额外的职责,并且在添加这些额外的职责时不会控制该类的执行逻辑。
适用场景:
     1.程序希望动态地增强类的某个对象的功能,而又不影响到该类的其他对象。
     2.采用继承来增强对象功能不利于系统的扩展和维护。

举个简单的例子:
麻雀类的实例(麻雀)能飞行100米,如果用麻雀类创建了5只麻雀,那么这5只麻雀都能飞行100米。假如想让其中一只能飞150米,怎么办?当然你可以在创建个特殊的麻雀类继承麻雀类,再实例化这个特殊的麻雀类。但是考虑到程序的扩展性,以及设计的一个基本原则:少用继承,多用组合。装饰模式就是一个很好的解决办法。在麻雀的这个例子,我们可以给这只特殊的麻雀装饰上一个电子翅膀,这样使它区别于其它麻雀。

代码如下:
Bird类:
public abstract class Bird {
   public abstract int fly();
}
具体组件:
Sparrow.java
public class Sparrow extends Bird {
      private final int DISTANCE = 100;
      @Override
      public int fly() {
            return DISTANCE;
      }
}

装饰
Decorator.java
public abstract class Decorator extends Bird {
      protected Bird bird;
      public Decorator(Bird bird) {
            this.bird = bird;
      }
}
具体装饰:
SparrowDecorator.java
public class SparrowDecorator extends Decorator {
      public final int DISTANCE = 50;
      SparrowDecorator(Bird bird) {
            super(bird);
      }
      @Override
      public int fly() {
            int distance = 0;
            distance = bird.fly() + eleFly();
            return distance;
      }
      private int eleFly() {
            return DISTANCE;
      }
}
装饰模式使用:
public class Application {
      private static void needBird(Bird bird) {
            int flyDistance =bird.fly();
            System.out.println("飞行距离"+flyDistance+"米");           
      }
      public static void main(String[] args) {
      Bird sparrowBird =new Sparrow();
      Bird sparrowBird2=new SparrowDecorator(sparrowBird);
      Bird sparrowBird3 =new SparrowDecorator(sparrowBird2);
      needBird(sparrowBird);
      needBird(sparrowBird2);
      needBird(sparrowBird3);
      }
}
Uml图如下:

2.png (6.1 KB, 下载次数: 13)

2.png

评分

参与人数 1技术分 +2 收起 理由
贠(yun)靖 + 2 赞一个!

查看全部评分

回复 使用道具 举报
曾虓 发表于 2012-4-14 21:52
装饰模式;
      给一个类添加一些额外的职责,并且在添加这些额外的职责时不会控制该类的执行逻辑。
适 ...

但是我多继承几个接口,可以不!
回复 使用道具 举报
李蛟龙 发表于 2012-4-14 22:44
但是我多继承几个接口,可以不!

这个就涉及到你软件开发的一个设计问题了。

还是以上面例子打个比方,假设你在麻雀类实现前,已经考虑到有特殊麻雀的存在,那倒是可以把飞行距离这个抽象成不同的接口,但是现在情况是你已经在麻雀类实现了飞行距离这个方法,如果你在擅自改动,就有可能会产生严重的问题。
在软件设计中,我们对于现有代码最好是扩展而不是修改,所以用接口来实现个人认为不是好主意,软件设计中能用组合解决的尽量用组合,少用继承。
希望能给你帮助。:P
回复 使用道具 举报
1.程序希望动态地增强类的某个对象的功能,而又不影响到该类的其他对象。
      2.采用继承来增强对象功能不利于系统的扩展和维护。
也可以用实现多个接口实现,但是阅读方面不是很简单,如果这个类的扩展都封装到一起的话,以后在出现这种类的时候再用来也比较方便。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马