设计模式--代理模式

什么是代理模式

为其它对象提供一种代理以控制这个对象的访问;在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

简单解释

  • 抽象角色:通过抽象或接口来生声明的具体业务实现方法;
  • 代理角色:实现抽象或接口定义的方法,是真实的代理角色,通过调用调用真实角色来实现具体的业务操作,并附加自己的操作;
  • 真实角色:实现抽象或接口定义的具体业务方法,供代理角色来调用;

UML类图

image

优点

  • 真实的角色实现实际的业务逻辑,不需要关心其它非本职之外的业务逻辑操作,通过后期代理实现业务逻辑控制,使逻辑更加清晰明了;
  • 代理角色在客户端与目标对象之间起了中介作用,这样中介的作用保护了目标对象;

代码实现

参照大话设计模式,以送礼物为例;

  • 创建一个抽象类,定义具体的送礼物的方法
/**
 * 定义一下抽象方法,声明具体的实现
 * 送实物抽象方法
 * @author ws
 * @version
 */
public abstract class IGiveGift {

    public abstract void giveDools();

    public abstract void giveFlowers();

    public abstract void giveChocolate();
}

  • 定义一个具体的实现类,继承抽象类,实现其送礼物的方法
/**
 * 继承并实现送礼物的方法
 * @author ws
 * @version 1.0
 */
public class Pursuit extends IGiveGift {

    private String name;

    public Pursuit(String name){
        this.name=name;
    }
    @Override
    public void giveDools() {
        System.out.println(String.format("%s,送你的娃娃",name));
    }
    @Override
    public void giveFlowers() {
        System.out.println(String.format("%s,送你的花",name));
    }
    @Override
    public void giveChocolate() {
        System.out.println(String.format("%s,送你的巧克力",name));
    }
}

  • 定义一个代理类,并且引入具体的实现类,继承抽象类,也实现其送礼物的方法
/**
 * 继承抽象类,同时引入实际业务操作类
 * @author ws
 * @version 1.0
 */
public class ProxyGiveGift extends IGiveGift {

    private Pursuit pursuit;
    private String name;

    public ProxyGiveGift(String name){
        this.name=name;
        pursuit=new Pursuit(name);
    }
    @Override
    public void giveDools() {
        pursuit.giveDools();
    }

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

    @Override
    public void giveChocolate() {
        pursuit.giveChocolate();
    }
}
  • 执行结果
public static void main(String[] args) {
        ProxyGiveGift proxy=new ProxyGiveGift("小花");
        proxy.giveDools();
        proxy.giveChocolate();
        proxy.giveFlowers();
    }
//------------    
小花,送你的娃娃
小花,送你的巧克力
小花,送你的花

参照:大话设计模式,菜鸟教程

你可能感兴趣的:(设计模式--代理模式)