静态代理[装饰设计模式]的具体实现
静态代理的运用场景:在原来的类的基础上进行扩展,与继承类相比,扩展性更强
应用的技术:反射+多态
核心思想:
<1>原来的类不允许修改
<2>有扩展需求
<3>继承可以解决问题,但有局限性,只能实现一个类,想实现其他功能不同的类就不行了
解决方法:
代理:去创建一个类控制对另一个类的访问
ps:代理类和实现类都实现了同一个接口,并且代理类有连接实现类的构造方法(实现类的对象是代理类的参数,乃至接口的实例是代理类的参数)
①创建一个共有接口,代码如下:
1 //创建共用接口 2 interface Actor { 3 //抽象方法 可以省略掉 public abstract 4 public abstract void Sing(int money); 5 6 void show(int money); 7 8 void eat(); 9 }
②创建一个具体的实现类(真正干活的类),代码如下:
1 public class Bao implements Actor { 2 @Override 3 public void Sing(int money) { 4 System.out.println("宝宝唱了一首歌!"); 5 } 6 7 @Override 8 public void show(int money) { 9 System.out.println("宝宝跳了一段舞!"); 10 } 11 12 @Override 13 public void eat() { 14 System.out.println("宝宝吃饭!"); 15 } 16 }
③创建一个调控者,对实现类进行管控,此案例中是对money进行管控,钱到位就干活,钱不够,嗯···就是钱不够,代码如下:
1 class proxy implements Actor{ 2 Actor actor; 3 public proxy (Actor actor){ 4 this.actor=actor; 5 } 6 @Override 7 public void Sing(int money) { 8 if (money>20){ 9 actor.Sing( money); 10 } 11 else{ 12 System.out.println("钱不够"); 13 } 14 } 15 16 @Override 17 public void show(int money) { 18 if (money>20){ 19 actor.show(money); 20 } 21 else{ 22 System.out.println("钱不够"); 23 } 24 } 25 26 @Override 27 public void eat() { 28 29 } 30 31 32 }
④测试类:
1 public class Test { 2 public static void main(String[] args) { 3 proxy p =new proxy(new Bao()); 4 p.Sing(21); 5 p.show(20); 6 } 7 }
⑤具体实现效果: