代理模式的主要作用是为各子类添加公共逻辑(如参数校验等),其包括公共接口,委托类,代理类三个角色。

公共接口:

/** 
 * 静态代理类接口, 委托类和代理类都需要实现的接口规范。 
 * 定义了一个猫科动物的两个行为接口,吃东西,奔跑。 
 * 作为代理类 和委托类之间的约束接口 
 */
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(); 
    } 
}