设计模式之代理模式
设计模式之代理模式
为别人做嫁衣
定义:
Provide a surrogate or placeholder for another object to controlaccess to it(为其他对象提供一种代理以控制对这个对象的访问)。使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。
UML:
应用场景举例:
A追求C,让B帮A送礼物等。
代码实现:
首先创建一个女生SchoolGirl类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package proxy01; 2 3 public class SchoolGirl { 4 private String name; 5 6 public String getName() { 7 return name; 8 } 9 10 public void setName(String name) { 11 this.name = name; 12 } 13 14 }
其次创建礼物IGiveGift接口
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package proxy01; 2 interface IGiveGift{ 3 4 void giveDolls(); 5 void giveFlowers(); 6 void giveChocolate(); 7 8 }
接着创建追求者Pursuit类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package proxy01; 2 3 public class Pursuit implements IGiveGift{ 4 5 SchoolGirl girl; 6 public Pursuit(SchoolGirl schoolGirl) { 7 girl=schoolGirl; 8 } 9 @Override 10 public void giveDolls() { 11 // TODO Auto-generated method stub 12 System.out.println(girl.getName()+" doll"); 13 } 14 15 @Override 16 public void giveFlowers() { 17 // TODO Auto-generated method stub 18 System.out.println(girl.getName()+" flower"); 19 } 20 21 @Override 22 public void giveChocolate() { 23 // TODO Auto-generated method stub 24 System.out.println(girl.getName()+" chocolate"); 25 } 26 27 }
再创建Proxy代理类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package proxy01; 2 3 public class Proxy implements IGiveGift { 4 Pursuit pursuit; 5 6 public Proxy(SchoolGirl schoolGirl) { 7 // TODO Auto-generated constructor stub 8 pursuit = new Pursuit(schoolGirl); 9 } 10 11 @Override 12 public void giveDolls() { 13 // TODO Auto-generated method stub 14 pursuit.giveDolls(); 15 } 16 17 @Override 18 public void giveFlowers() { 19 // TODO Auto-generated method stub 20 pursuit.giveFlowers(); 21 } 22 23 @Override 24 public void giveChocolate() { 25 // TODO Auto-generated method stub 26 pursuit.giveChocolate(); 27 } 28 29 }
最终实现测试类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package proxy01; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 // TODO Auto-generated method stub 7 SchoolGirl schoolGirl =new SchoolGirl(); 8 schoolGirl.setName("le"); 9 Proxy proxy=new Proxy(schoolGirl); 10 proxy.giveDolls(); 11 proxy.giveFlowers(); 12 proxy.giveChocolate(); 13 } 14 15 }
初学《大话设计模式》