public interface Operation {
String description();
void command();
}
Test为自带测试类:
public interface Robot {
String name();
String model();
List<Operation> oprations();
class Test{
public static void test(Robot r) {
if(r instanceof Null)
System.out.println("Null Robot");
System.out.println("Robot name:" + r.name());
System.out.println("Robot model:" + r.model());
r.oprations().forEach(opration->{
System.out.println(opration.description());
opration.command();
});
}
}
}
实现类:扫雷游戏
public class SnowRemovalRobot implements Robot{
private String name;
public SnowRemovalRobot(String name) {
this.name = name;
}
@Override
public String name() {
return name;
}
@Override
public String model() {
return "SnowBot Series 1l";
}
@Override
public List<Operation> oprations() {
return Arrays.asList(
new Operation() {
@Override
public String description() {
return name + "can shovel snow";
}
@Override
public void command() {
System.out.println(name + "shoveling snow");
}
},
new Operation() {
@Override
public String description() {
return name + "can chip icp";
}
@Override
public void command() {
System.out.println(name + "chipping ice");
}
},
new Operation() {
@Override
public String description() {
return name + "can clear the roof";
}
@Override
public void command() {
System.out.println(name + "clearing roof");
}
}
);
}
}
或许你的许多的Robot,想对每一个Robot都创建一个空对象,这里可以使用动态代理的方式:为每一个实现Robot的超类动态的生成空对象,而且动态代理还提供了面对切面编程的能力
class NullRobotProxyHandler implements InvocationHandler{
private String nullName;
public NullRobotProxyHandler(Class<? extends Robot> c) {
super();
nullName = c.getSimpleName() + " NullRobot";
}
private Robot n = new NRobot();
private class NRobot implements Null,Robot{
@Override
public String name() {
return nullName;
}
@Override
public String model() {
return nullName;
}
@Override
public List<Operation> oprations() {
return Collections.emptyList();
}
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(n, args);
}
}
调用:这里分别生成了
SnowRemovalRobot
和
它的空对象
public class NullRobot {
public static Robot newNullRobot(Class type) {
return (Robot)Proxy.newProxyInstance(type.getClassLoader(),
new Class[] {Null.class ,Robot.class}, new NullRobotProxyHandler(type));
}
public static void main(String[] args) {
Robot[] bots = {
new SnowRemovalRobot("snowBee"),
newNullRobot(SnowRemovalRobot.class)
};
Arrays.asList(bots).forEach(robot-> Robot.Test.test(robot));
}
}