JavaSE之面向对象编程—抽象类与接口—— 5(代理设计模式)

                                                                                        代理设计模式
一、代理设计模式
代理设计模式:就是两个子类共同实现一个接口,其中一个子类负责真实业务实现,另外一个子类完成辅助性功能。
下面我们通过例子讲解我们的代理模式:

//代理设计模式
//送花:张三需要送花给李四,但是又不要自己送花,通过快递员给李四送花
interface SendFlower{
	public void sendFlower();
}
//这是我们真正的类,就是主要的
class BoyFirend implements SendFlower{
	public void sendFlower(){
		System.out.println("张三送给李四的花");
	}
}
//这是我们的代理,快递员
class ProxyBoyFirend implements SendFlower{
	//首先我们需要知道的是,快递源在给李四送花的过程中,需要先打电话确认
	//在确认有人的情况下,再去给李四送花——代替张三实现这个过程
	//送完花以后还需要签收
	private SendFlower sendPeople;//这个是真正的操作业务,声明对象
	public ProxyBoyFirend(SendFlower sendPeople){//这个代理类的构造方法我们需要将真正业主的名字传进去
		this.sendPeople=sendPeople;//构造方法中的含参定义为这样这为了后面调用真正的实现方法
	}
	public void Tel(){
		System.out.println("打电话确认这个时间段是否有人");
	}
	public void Write(){
		System.out.println("收到花以后签字");
	}
	//这个方法是为了让这个代理业务形成一个流水线,只要创建对象那么就将这个方法执行一下
	public void sendFlower(){//代理对象对接口中抽象方法的重写就是将整个过程都写进这个方法中
		this.Tel();
		this.sendPeople.sendFlower();//真实操作业务:这个业务的定义是在接口中的,但是我们在真正的操作者中
		                             //对他进行了实例化,所以我们只能通过真正的操作者才能调用这个函数。
	    this.Write();
	}
}
class Factory{
	public static SendFlower getInstance(){//这个方法我们是为了实现返回真正的对象
		return new ProxyBoyFirend(new BoyFirend());
	}
}
public class Daili{
	public static void main(String[] args){
		//在这我们只需要通过代理对象来操作这个过程即可
		SendFlower sd=Factory.getInstance();
	    sd.sendFlower();
	}
}

在这里插入图片描述
代理模式的实现原理:首先我们将一个需要实现的过程抽象为一个方法,将这个方法放在接口中,然后分别用两个类来实现接口中的这个方法。第一个类只是覆写这个方法实现接口,这个类叫做真正的操作类;然后是第二个类叫代理类,这个类将实现这个过程所有需要考虑的因素都考虑在里面,在这个类里面首先需要需要声明一个真正业务的对象,因为需要通过这个真正的业务去实现真正的操作过程。然后再定义这个代理类的构造方法,这个构造方法是含参构造方法,这个参数就是真正的业务对象,目的是为了可以实现在这个类的后面调用真正业务类中的方法;然后在这个代理类中继续定义辅助方法,最后覆写接口中的方法 ,这个方法里面就将代理的整个过程写进去,就是通过this调用方法,在实现真正的业务的时候就是通过我们刚才的构造方法就可以实现它的调用。代理类完了就是一个工厂类,这个类里面只定义一个方法,这个方法只是创建了代理类的一个匿名对象并且返回。最后我们在主方法中,只需要创建接口的对象,这个对象通过工厂类调用它里面的方阿飞,返回的是代理类的对象,实现的是向上转型。然后调用接口中的方法,即可实现这个过程。
二、抽象类与接口的区别
我们将从结构组成、权限、子类使用、关系、子类限制来进行对比:
(1)结构组成:抽象类:抽象方法+普通方法组成;
                            接口:抽象方法+全局常量(static final)
(2)权限: 抽象类:各种权限
                            接口:public
(3)关系: 抽象类:一个抽象类可以实现多个接口
                            接口:不能实现抽象类。可以通过extends继承多个接口。
(4)子类限制: 抽象类:一个类只能继承一个类
                            接口:一个类可以实现多个接口。

猜你喜欢

转载自blog.csdn.net/ZhuiZhuDream5/article/details/84347582