设计模式之静态代理(staticproxy)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38005943/article/details/82107949

静态代理模式(Proxy):代理类是自己定义好的,在程序运行之前就已经编译完成.
  为其他对象提供一种代理以控制对这个对象的访问
  核心是一个公共接口,一个委托类,一个代理类,代理类和委托类具有同样的接口,代理类持有委托类的实例,代为执行具体类的实例方法
  Subject类:定义了RealSubject和Proxy的功用接口.这样就在任何使用RealSubject的地方都可以使用Proxy
  Proxy类:保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理可以替代实体
  RealSubject类:定义Proxy所代表的真实实体
  最直白的应用就是Spring的AOP,能在一个切点之前执行一些操作,在一个切点之后执行一些操作,这个切点就是一个个方法,这些方法所在类肯定就是被代理了,在代理过程中切入了一些其他操作.

例子是通过朋友送礼物的场景

/**
 * 代理接口
 * @author guk
 *
 */
public interface GiveGift {
    public void giveDolls();
    public void giveFlowers();
    public void giveChocolate();
}

    public static void main(String[] args) {
        SchoolGirl mm=new SchoolGirl();
        mm.setName("娇娇");
        Proxy proxy=new Proxy(mm);
        proxy.giveDolls();
        proxy.giveChocolate();
    }

/**
 * 代理类
 * @author guk
 *
 */
public class Proxy implements GiveGift {
    private Pursuit gg;//代理类持有追求者类实例
    
    public Proxy(SchoolGirl mm) {
        gg=new Pursuit(mm);
    }

    @Override
    public void giveDolls() {
        gg.giveDolls();
    }

    @Override
    public void giveFlowers() {
        gg.giveFlowers();
    }

    @Override
    public void giveChocolate() {
        gg.giveChocolate();
    }
 
}
 

/**
 * 追求者类
 * @author guk
 *
 */
public class Pursuit implements GiveGift {
    private SchoolGirl mm;
    
    public Pursuit(SchoolGirl mm) {
        this.mm=mm;
    }
    
    @Override
    public void giveChocolate() {
        //假设花了1秒时间
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
           //TODO
        }
        
        System.out.println(mm.getName()+",送你巧克力");
    }
    
    @Override
    public void giveDolls() {
        //假设花了1秒时间
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
           //TODO
        }
        System.out.println(mm.getName()+",送你洋娃娃");
        
    }
    @Override
    public void giveFlowers() {
        //假设花了1秒时间
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
           //TODO
        }
        System.out.println(mm.getName()+",送你花");
        
    }
}

public class SchoolGirl {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
}

猜你喜欢

转载自blog.csdn.net/qq_38005943/article/details/82107949