【问题标题】:Best design pattern to wrap library specific objects?包装库特定对象的最佳设计模式?
【发布时间】:2012-02-11 03:20:15
【问题描述】:

我对设计模式还很陌生。当开发人员使用库(在我的情况下是用于截屏 HTML 的库)并且不希望客户端/调用类“卡”到该库时,最好的模式是什么?

例如,如果我在名为 HtmlPage 的库中使用一个类,并且客户端说“getPage()”- 我不想从库中返回 HtmlPage 对象,而是返回某种 HtmlPage 的包装器如果我决定更改库,我可以换掉。就这么简单吗?还是我错过了什么?我必须对库中的每个对象都这样做吗?

public class HtmlPageWrapper {
    private HtmlPage htmlPage;

    public HtmlPageWrapper(HtmlPage) {}

    public getTableOnPage() {
        return htmlPage.getTableOnPage;
    }

    // etc...

}

谢谢!

【问题讨论】:

    标签: java design-patterns


    【解决方案1】:

    我认为您对Adapter Pattern 感兴趣。这将使您可以通过创建一个Adapter 类来使这些第三方类远离您的代码,该类公开您的应用程序将使用的抽象操作。

    您不必对库中的每个对象都执行此操作,只需确保包装您需要与之交互的主要对象即可。

    【讨论】:

    • 谢谢,我认为这可能是一个可以使用的,但我认为这只是为了将不兼容的类连接在一起......也许我只是想多了。
    • 这是最常见的用例,但您也可以在您的场景中使用它,因为将来如果您引入不同的 html 屏幕抓取库,那么该库的界面可能与当前库不兼容,并且因此将与您的代码不兼容。
    【解决方案2】:

    我只是扩展它并覆盖我想要更改/添加的那些,然后我可以重复使用我仍然喜欢的那些,

    public class HtmlPageWrapper extends HtmlPage {
    
        public HtmlPageWrapper(HtmlPage p) {
             super(p);
        }
    
        @Override
        public getTableOnPage() {
            return super.getTableOnPage();
        }
    
        // etc...
    
    }
    

    【讨论】:

    • 通常你只需要几个方法,所以只要这是真正的组合可能比继承更好。
    【解决方案3】:

    如果您想将库隐藏在单个接口后面,您也可以尝试 Façade 模式,这样可以为不同的库提供不同的实现。

    为子系统中的一组接口提供统一的接口。 Façade 定义了一个更高级别的接口,使子系统更易于使用。

    参考:Façade Pattern

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多