静态代理[装饰设计模式]的具体实现

静态代理的运用场景:在原来的类的基础上进行扩展,与继承类相比,扩展性更强

应用的技术:反射+多态

核心思想:

<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 }

⑤具体实现效果:

 

posted @ 2019-02-12 01:51  o_osky  阅读(328)  评论(0编辑  收藏  举报