软件构造复习内容(4)---可复用性(1)

复用类型:

  白盒复用:源码可见,可修改和扩展

  黑盒复用: 源码不可见,不能修改,只能通过API接口使用

一。代码层面的复用

  copy--paste

二。模型层面的复用(class and interface)

 类复用

  1. 继承   inheritance
  2. 委托 delegation

 库复用(一系列方法APIs)   用户主导

  1. API
  2. Package

系统级别的复用Framework复用      框架主导

  框架:一组具体类,抽象类以及之间的连接关系,只有骨架没有血肉

  开发者根据framework的规约,填充自己的代码进去,形成完整的系统

三。委托介绍

  子类只需要复用父类的一小部分方法,可以不使用继承,而是通过委托的机制来实现,从而避免继承大量无用的方法

  Composite Reuse Principle(CRP)  组合复用原则,具体体现在委托中

  一个object和另一个object的关系 has_a , use_a , is_a

  委托的类型

  1.依赖Dependency(use_a) 

    临时性的delegation

    (UML 表示 ------>)

class Duck{

  void fly(Flyable f){
    f.fly();    
  }
        
}

  在被委托类中没有属性存储委托的对象,将其放置在方法的参数列表中

  2.关联Association

    永久性的delegation(has_a)

   UML表示:单向的关联用带一个箭头的实线来表示,箭头从使用类指向被关联(委托)类

public class Duck {
    Flyable f = new CannotFly();

    public Duck(Flyable f) {
        this.f = f;
    }

    void Duck() {
        f = new FlyWithWings();
    }

    void fly() {
        f.fly();
    }
}

    在类构造对象的时候表明委托谁来做

  3.Composition(is_part_of) 更强的Association,但难以变化

   UML实心菱形在被委托的一方,然后使用实线连接

public class Duck {
    Flyable f = new FlyWithWings();
    void fly() {
        f.fly();
    }
   
}

  要委托的对象在类中直接确定好,不可改变

  4.Aggregation(更弱的association),可动态变化

  UML表示 空心菱形在被委托的一方,然后使用实线连接

  提供了一个set方法进行修改

public class Duck {
    Flyable f = new FlyWithWings();

    //构造器
    public Duck(Flyable f) {
        this.f = f;
    }

    void fly() {
        f.fly();
    }

    //set
    void setFlyBehavior(Flyable f) {
        this.f = f;
    }
}

  

 

猜你喜欢

转载自www.cnblogs.com/guiququ/p/13179638.html