• JAVA设计模式之静态代理


     
    作者:刘信坚
    链接:http://www.imooc.com/article/details/id/47695
    来源:慕课网

    首先看看什么是代理模式。

    一 代理模式

           使用一个代理对象将对象包装起来,然后用该代理对象来取代该对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时调用原始对象的方法

    二 静态模式

           要求被代理类和代理类同时实现相应的一套接口,通过代理类调用重写接口的方法,实际上调用的是原始对象的同样的方法。如下图:

    https://img2.sycdn.imooc.com/5b5b38cd0001b46a06140248.jpg

         Cilent调用Source的method()方法,实际上是Proxy来调用method()方法,静态代理中Source跟Proxy都要实现接口Sourceable。

    三 运行环境

    首先是父接口 Animal.java 

    package com.lxj.proxy;
    
    
    public interface Animal {
    	
    	public void action();
    	public void breath();
    	
    }

    Cat.java

    package com.lxj.proxy;
    
    
    //被代理类Cat
    public class Cat implements Animal{
    
    	@Override
    	public void action() {
    		System.out.println("喵喵喵~~~~");
    	}
    
    	@Override
    	public void breath() {
    		System.out.println("猫式呼吸法~~~~");
    	}
    }

    CatProxy.java

    package com.lxj.proxy;
    
    //代理类
    public class CatProxy implements Animal{
    
    	//真正要代理的类
    	Cat cat;
    	
    	public CatProxy(Cat cat){
    		this.cat = cat;
    	}
    	
    	@Override
    	public void action() {
    		System.out.println("==========DogProxy 代理类执行开始!=============");
    		//实质上在代理类中是调用了被代理实现接口的方法
    		cat.action();
    		System.out.println("==========DogProxy 代理类执行结束!===========");
    	}
    
    	@Override
    	public void breath() {
    		System.out.println("==========DogProxy 代理类执行开始!=============");
    		cat.breath();
    		System.out.println("==========DogProxy 代理类执行结束!===========");
    	}
    
    }

    TestStaticProxy.java

    package com.lxj.proxy;
    
    
    public class TestStaticProxy {
    	
        public static void main(String[] args) {
    		 //被代理的类Cat,Cat实现了Animal接口
             Cat cat = new Cat();
             //代理类CatProxy,也实现了Animal接口
    		 CatProxy catProxy = new CatProxy(cat);
             //代理类来调用方法,实际上调用的是Cat的action(),breath()方法
    		 catProxy.action();
    		 catProxy.breath();
    	}
    }

    运行结果如下:

    https://img1.sycdn.imooc.com/5b5b3b380001c16011360749.jpg

    从运行结果可以看到其实执行的是被代理类的对象.

    从这里我们会想,如果我想再创建一个Dog对象,又需要重新为Dog创建一个代理对象,如下:

    Dog.java

    package com.lxj.proxy;
    
    //被代理类 Dog
    public class Dog implements Animal {
    
    	@Override
    	public void action() {
            System.out.println("汪汪汪~~~~~");
    	}
    
    	@Override
    	public void breath() {
            System.out.println("狗式呼吸法~~~~");
    	}
    
    }

    DogProxy.java

    package com.lxj.proxy;
    
    //Dog的代理类
    public class DogProxy implements Animal {
       
    	Dog dog;
    	
    	public DogProxy(Dog dog) {
    		this.dog = dog;
    	}
    
    	@Override
    	public void action() {
    		System.out.println("==========DogProxy 代理类执行开始!=============");
    		dog.action();		
    		System.out.println("==========DogProxy 代理类执行结束!===========");
    	}
    
    	@Override
    	public void breath() {
    		System.out.println("==========DogProxy 代理类执行开始!=============");
    		dog.breath();
    		System.out.println("==========DogProxy 代理类执行结束!===========");
    	}
    	
    }

    TestStaticProxy.java

    package com.lxj.proxy;
    
    
    public class TestStaticProxy {
    	
        public static void main(String[] args) {
    		 Cat cat = new Cat();
    		 CatProxy catProxy = new CatProxy(cat);
    		 catProxy.action();
    		 catProxy.breath();
    		 
    		 Dog dog = new Dog();
    		 DogProxy dogProxy = new DogProxy(dog);
    		 dogProxy.action();
    		 dogProxy.breath();
    	}
    }

    运行结果如下:

    https://img4.sycdn.imooc.com/5b5b3bc400017a4e09590792.jpg

  • 相关阅读:
    static、final、this、super关键
    细节二:参数、引用类型、实例化
    枚举类型
    单例模式
    细节一:字符串、switch、默认值、数组
    类属性和类方法
    装饰器模式
    TreeSet
    可见参数和增强for以及自动拆装箱
    静态导入
  • 原文地址:https://www.cnblogs.com/ljq2622/p/10449034.html
Copyright © 2020-2023  润新知