黑马程序员技术交流社区

标题: (包装模式||子类继承父类) [打印本页]

作者: 李蛟龙    时间: 2012-4-14 20:46
标题: (包装模式||子类继承父类)
相信大家在刚开始学习java的时候对其继承特征有所了解,但是当我们学习过包装模式后,怎么分析两者的区别,或者说怎么区分应用!
作者: 曾虓    时间: 2012-4-14 21:52
装饰模式;
      给一个类添加一些额外的职责,并且在添加这些额外的职责时不会控制该类的执行逻辑。
适用场景:
     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, 下载次数: 36)

2.png

作者: 李蛟龙    时间: 2012-4-14 22:44
曾虓 发表于 2012-4-14 21:52
装饰模式;
      给一个类添加一些额外的职责,并且在添加这些额外的职责时不会控制该类的执行逻辑。
适 ...

但是我多继承几个接口,可以不!
作者: 曾虓    时间: 2012-4-14 23:00
李蛟龙 发表于 2012-4-14 22:44
但是我多继承几个接口,可以不!

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

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





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