代理模式的主要作用是为各子类添加公共逻辑(如参数校验等),其包括公共接口,委托类,代理类三个角色。
公共接口:
/**
* 静态代理类接口, 委托类和代理类都需要实现的接口规范。
* 定义了一个猫科动物的两个行为接口,吃东西,奔跑。
* 作为代理类 和委托类之间的约束接口
*/
public interface Cat {
public String eatFood(String foodName);
public boolean running();
}
委托类:
/**
*狮子 实现了猫科动物接口Cat, 并实现了具体的行为。作为委托类实现
*/
public class Lion implements Cat {
private String name;
private int runningSpeed;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getRunningSpeed() { return runningSpeed; }
public void setRunningSpeed(int runningSpeed) {
this.runningSpeed = runningSpeed;
}
public Lion() { }
@Override
public String eatFood(String foodName) {
String eat = this.name + " Lion eat food. foodName = " + foodName;
System.out.println(eat);
return eat;
}
@Override
public boolean running() {
System.out.println(this.name + " Lion is running . Speed :" + this.runningSpeed);
return false;
}
}
代理类:
/** 饲养员 实现Cat接口,作为静态代理类实现。代理狮子的行为。
* 代理类中可以新增一些其他行为,在实践中主要做的是参数校验的功能。
*/
public class FeederProxy implements Cat {
private Cat cat;
public FeederProxy(){}
public FeederProxy(Cat cat) {
if (cat instanceof Cat) {
this.cat = cat;
}
}
public void setCat(Cat cat) {
if (cat instanceof Cat) {
this.cat = cat;
}
}
@Override
public String eatFood(String foodName) {
System.out.println("proxy Lion exec eatFood ");
return cat.eatFood(foodName);
}
@Override
public boolean running() {
System.out.println("proxy Lion exec running.");
return cat.running();
}
}
测试类:
public class staticProxyTest {
public static void main(String[] args) {
Lion lion = new Lion();
lion.setName("狮子 小王");
lion.setRunningSpeed(100);
Cat proxy = new FeederProxy(lion);
System.out.println(Thread.currentThread().getName()+" -- " + proxy.eatFood("水牛"));
proxy.running();
}
}