0

假设:
一个简单的模块化 java 库只有两个模块:

package com.mycorp.lib.logger;
public class LogcatLogger implements Logger {

    @Override
    public void out(LogcatLogger.LogMessage message){
        Log.i("TAG", message.status);
    }

    ...
}

package com.mycorp.lib.webservice;
public class JsonWebservice implements Webservice {

    @Override
    public void onErrorFound(String status) {
        LogcatLogger.LogMessage message = new LogcatLogger.LogMessage();
        message.status = status;
        LogcatLogger.out(message);
    }

    ...
}

问题:
如何使com.mycorp.lib.webservicecom.mycorp.lib.logger像这样独立?(客户端应用程序也可以调用方法) 目标设计

注意:
我之前尝试过命令模式
结果:api有很多方法,必须创建很多命令类

Update1 :​​将LogMessage
添加为LogcatLogger的嵌套静态类,以应对更具挑战性的情况

更新 2:
添加了目标设计图像。

任何帮助表示赞赏。

4

1 回答 1

1

使用策略模式。基本上,让 LogcatLogger 实现一个自定义接口,并在服务中引用该接口。

package com.mycorp.lib.invoker;
public interface Logger {
    void out(Loggable message);
}

package com.mycorp.lib.invoker;
public interface Loggable {
    void setStatus(String status);
    String getStatus();
}

package com.mycorp.lib.invoker;
public class LoggableFactory {
    public static Loggable createDatabaseLogMessage() { return new DatabaseLogMessage(); }
    public static Loggable createWebserviceLogMessage() { return new WebserviceLogMessage(); }
}

package com.mycorp.lib.logger;
public class WebserviceLogMessage implements Logger {

    @Override public void out(Loggable message){
        Log.i("TAG", message.getStatus());
    }

    ...
}

package com.mycorp.lib.logger;
public class DatabaseLogMessage implements Logger {
    @Override public void out(Loggable message) {
        Log.i("JDBC",message.getStatus());
        otherFancyStuff(); // whatever ? :)
    }
}

package com.mycorp.lib.webservice;
public class JsonWebservice implements Webservice {
    Logger out;

    JsonWebservice(Logger out) { this.out = out; }

    @Override
    public void onErrorFound(String status) {
        Loggable message = LoggableFactory.createWebserviceLogMessage();
        message.setStatus(status);
        out.out(message);
    }

    ...
}
于 2012-08-03T19:23:03.740 回答