白盒框架与黑盒框架

前一篇文章介绍了java中的委派和继承机制,今天介绍一下利用这两种代码复用的方式组装的两种框架——白盒框架与黑盒框架

介绍

为了增加代码的复用性,可以使用委派和继承机制。同时,在使用这两种机制增加代码复用的过程中,我们也相应地在不同的类之间增加了关系(委派或继承关系)。

而对于一个项目而言,各个不同类之间的依赖关系就可以看做为一个框架。一个大规模的项目可能由许多不同的框架组合而成。

与设计模式的区别

框架与设计模式很相似,但有本质的不同。可以说设计模式是框架的一部分,一个框架可以包含一个或多个设计模式。相对于设计模式,框架的概念更大。设计模式是将框架中的的思想抽象出来,解决更多不同领域中相似的实际问题。

框架主要分为两类——白盒框架与黑盒框架,下面详细地介绍这两种框架。

白盒框架的原理与实现

白盒框架是基于面向对象的继承机制。之所以说是白盒框架,是因为在这种框架中,父类的方法对子类而言是可见的。子类可以通过继承或重写父类的方法来实现更具体的方法。

虽然层次结构比较清晰,但是这种方式也有其局限性,父类中的方法子类一定拥有,要么继承,要么重写,不可能存在子类中不存在的方法而在父类中存在。

软件构造课程中有关白盒框架的例子:

public abstract class PrintOnScreen {
    public void print() { 
        JFrame frame = new JFrame(); 
        JOptionPane.showMessageDialog(frame, textToShow());
        frame.dispose();
    } 
    protected abstract String textToShow(); 
}
public class MyApplication extends PrintOnScreen {
@Override protected String textToShow() {
        return "printing this text on " + "screen using PrintOnScreen " + "white Box Framework"; 
    }
}

黑盒框架的原理与实现

黑盒框架时基于委派的组合方式,是不同对象之间的组合。之所以是黑盒,是因为不用去管对象中的方法是如何实现的,只需关心对象上拥有的方法。

这种方式较白盒框架更为灵活,因为可以在运行时动态地传入不同对象,实现不同对象间的动态组合;而继承机制在静态编译时就已经确定好。

黑盒框架与白盒框架之间可以相互转换,具体例子可以看一下,软件构造课程中有关黑盒框架的例子,更改上面的白盒框架为黑盒框架:

public interface TextToShow { 
    String text(); 
}
public class MyTextToShow implements TextToShow {
    @Override 
    public String text() { 
        return "Printing"; 
    }
}
public final class PrintOnScreen {
    TextToShow textToShow;   
    public PrintOnScreen(TextToShow tx) { 
        this.textToShow = tx; 
    }
    public void print() { 
        JFrame frame = new JFrame(); 
        JOptionPane.showMessageDialog(frame, textToShow.text());
        frame.dispose(); 
    }
} 

猜测下面代码的结果:

PrintOnScreen m = new PrintOnScreen(new MyTextToShow()); 
m.print();

二者对比

白盒框架利用subclassing:

  • 允许扩展每一个非私有方法
  • 需要理解父类的实现
  • 一次只进行一次扩展
  • 通常被认为是开发者框架

黑盒框架使用委派中的组合composition:

  • 允许在接口中对public方法扩展
  • 只需要理解接口
  • 通常提供更多的模块
  • 通常被认为是终端用户框架,平台

在具体项目中,还需要根据具体情况选用不同的框架。通常情况下黑盒白盒是一起使用,相互配合,以达到预期效果。

参考文章

HIT2018软件构造课件(王忠杰版)

应用框架的基本思想

猜你喜欢

转载自blog.csdn.net/Seriousplus/article/details/80525876
今日推荐