//: typeinfo/Operation java
public interface Operation { String description): void commandO; } ///.-
Чтобы воспользоваться услугами робота, следует вызвать метод operations():
//: typeinfo/Robot.java import java.util *; import net.mindview util.*:
public interface Robot { String nameO, String model О; List operationsO: class Test {
public static void test(Robot r) { if(r instanceof Null)
System.out.pri ntin("[Nul1 Robot]"). System.out.println("Ha3BaHMe- " + r.nameO); System, out. pri nti n( "Модель " + r.model О). for(Operation operation : r.operationsO) {
System, out. pri nti n(operati on description)): operation.commandO;
}
}
}
} ///.-
При этом используется вложенный класс, выполняющий проверку. Теперь мы можем создать робота для уборки снега:
// typeinfo/SnowRemovalRobot java import java util.*.
public class SnowRemovalRobot implements Robot { private String name.
public SnowRemovalRobot(String name) {this name = name,} public String nameО { return name; } public String model О { return "SnowBot Series 11". } public List operations О { return Arrays.asListC
new OperationO {
public String description) {
return name + " может убирать снег",
}
public void commando {
System out.println(name + " убирает снег"),
}
}.
new OperationO {
public String descriptionO {
return name + " может колоть лед".
}
public void commando {
System out println(name + " колет лед");
}
ь
new OperationO {
public String descriptionO {
return name + " может чистить крышу";
}
public void commando {
System out.println(name + " чистит крышу"),
}
}
);
}
public static void main(String[] args) {
Robot Test.test(new SnowRemovalRobot("SIusher"));
}
} /* Output: Название: Slusher Модель: SnowBot Series 11 Slusher может убирать снег Slusher убирает снег Slusher может колоть лед-Si usher колет лед Slusher может чистить крышу Slusher чистит крышу *///:-
Предполагается, что существуют разные типы роботов, и для каждого типа Robot объект с неопределенным состоянием должен делать что-то особенное — в нашем примере выдавать информацию о конкетном типе Robot, представленном объектом. Эта информация перехватывается динамическим посредником:
//: typeinfo/NullRobot.java
// Использование динамического посредника для создания
// объекта с неопределенным состоянием import java.lang.reflect *, import java util *, import net.mindview util.*;
class NullRobotProxyHandler implements InvocationHandler { private String null Name; private Robot proxied = new NRobotO. NullRobotProxyHandler(CIass