代理模式也叫委托模式,是结构型设计模式的一种,为其他对象提供一种代理以控制对这个对象的访问。比如代购、代理上网、打官司等,就是在一些情况下客户不想或者不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。
代理模式的主要类型:
远程代理:为一个对象在不同的地址空间提供局部代表,这样系统可以将Server部分的事项隐藏。
虚拟代理:使用一个代理对象表示一个十分耗资源的对象并在真正需要时才创建。
安全代理:用来控制真实对象访问时的权限。
智能指引:当调用真实的对象时,代理处理另外一些事,比如计算真实对象的引用计数,当该对象没有引用时,可以自动释放它;或者访问一个实际对象时,检查是否已经能够锁定它,以确保其他对象不能改变它。
角色:
1.抽象主题角色:声明了真实主题和代理主题的共同接口。
2.代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口。
3.真实主题角色:定义真实的对象。
package proxy;
/*
* 代理模式
*/
public interface FixBug {
public void giveSnack();
public void giveRice();
public void giveDrinks();
}
package proxy;
/*
* 代理模式
*/
public class BugDou implements FixBug{
Manager manager = null;
public BugDou(Manager manager){
this.manager = manager;
}
@Override
public void giveSnack() {
System.out.println(this.manager.getName()+"得到零食,可以解决Bug");
}
@Override
public void giveRice() {
System.out.println(this.manager.getName()+"得到午饭,可以解决Bug");
}
@Override
public void giveDrinks() {
System.out.println(this.manager.getName()+"得到饮料,可以解决Bug");
}
}
package proxy;
/*
* 代理模式
*/
public class Manager {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package proxy;
/*
* 代理模式
*/
public class FeiFei implements FixBug{
BugDou bugDou;
public FeiFei(Manager manager){
bugDou = new BugDou(manager);
}
@Override
public void giveSnack() {
bugDou.giveSnack();
}
@Override
public void giveRice() {
bugDou.giveRice();
}
@Override
public void giveDrinks() {
bugDou.giveDrinks();
}
}
package proxy;
/*
* 代理模式
*/
public class FixSuccess {
public static void main(String[] args) {
Manager manager1 = new Manager();
manager1.setName("子墨");
Manager manager2 = new Manager();
manager2.setName("七哥");
FeiFei feiFei1 = new FeiFei(manager1);
FeiFei feiFei2 = new FeiFei(manager2);
feiFei1.giveSnack();
feiFei2.giveRice();
feiFei1.giveDrinks();
}
}
请关注“知了堂学习社区”,地址:http://www.zhiliaotang.com/portal.php