'Друг' понятие полезен в Java, например, для разделения API от его реализации. Классам реализации свойственно должно получить доступ к внутренностям класса API, но они не должны быть представлены клиентам API. Это может быть достигнуто с помощью 'Друга Средство доступа' шаблон, как детализировано ниже:
класс представил через API:
package api;
public final class Exposed {
static {
// Declare classes in the implementation package as 'friends'
Accessor.setInstance(new AccessorImpl());
}
// Only accessible by 'friend' classes.
Exposed() {
}
// Only accessible by 'friend' classes.
void sayHello() {
System.out.println("Hello");
}
static final class AccessorImpl extends Accessor {
protected Exposed createExposed() {
return new Exposed();
}
protected void sayHello(Exposed exposed) {
exposed.sayHello();
}
}
}
класс, предоставляющий 'другу' функциональность:
package impl;
public abstract class Accessor {
private static Accessor instance;
static Accessor getInstance() {
Accessor a = instance;
if (a != null) {
return a;
}
return createInstance();
}
private static Accessor createInstance() {
try {
Class.forName(Exposed.class.getName(), true,
Exposed.class.getClassLoader());
} catch (ClassNotFoundException e) {
throw new IllegalStateException(e);
}
return instance;
}
public static void setInstance(Accessor accessor) {
if (instance != null) {
throw new IllegalStateException(
"Accessor instance already set");
}
instance = accessor;
}
protected abstract Exposed createExposed();
protected abstract void sayHello(Exposed exposed);
}
доступ В качестве примера от класса в 'друге' пакет реализации:
package impl;
public final class FriendlyAccessExample {
public static void main(String[] args) {
Accessor accessor = Accessor.getInstance();
Exposed exposed = accessor.createExposed();
accessor.sayHello(exposed);
}
}
Там diff_prettyHtml ()
в diff-match-patch ] библиотека от Google.
Обычно, если вы хотите, чтобы какой-то HTML отображался более красивым способом, вы делаете это, добавляя CSS.
Например, если вы генерируете HTML такой:
import difflib
import sys
fromfile = "xxx"
tofile = "zzz"
fromlines = open(fromfile, 'U').readlines()
tolines = open(tofile, 'U').readlines()
diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile)
sys.stdout.writelines(diff)
тогда вы получите зеленый фон на добавленных строках, желтый на измененных строках и красный на удаленных. Если бы я делал это, я бы взял сгенерированный HTML, извлек бы тело, и добавлю к нему мой собственный рукописный блок HTML с большим количеством CSS, чтобы он выглядел хорошо. Я бы также, вероятно, вырезал таблицу легенды и переместил ее наверх или поместил в div, чтобы CSS мог это сделать.
На самом деле, я бы серьезно подумал о том, чтобы просто исправить модуль diffflib (который написан на python), чтобы сгенерировать лучший HTML и внести его обратно в проект. Если у вас есть эксперт по CSS, который может вам помочь, или вы сами являетесь одним из них, подумайте об этом.
попробуйте сначала очистить оба HTML с помощью lxml.html и проверить разницу с помощью difflib
Копия моего собственного ответа из здесь .
А как насчет DaisyDiff ( Java и PHP доступны версии).
Следующие функции действительно хороши: