首先我们应该理解一下代理模式的概念:
一个接口,两个子类分别实现它,一个子类全程做的是辅助,框架的作用,另一个做的是真正的要做的事
下面我要举个例子来解释一下我对代理模式的理解:
假设客户要去买一杯奶茶,奶茶店员并不知道他要的什么口味的,红豆、巧克力、香草、原味、芒果、蓝莓等等,店员要做的就是加入各种口味的调味品,加热奶茶,并且装入奶茶杯中,最后与客户达成交易。在这个例子中,客户跟店员就是两个子类,前者完成主要业务(决定奶茶的最终口味),后者完成相关辅助业务,核心功能就是买奶茶,是个接口,下面先实现一下功能。
首先写个接口,简单来说就是:买奶茶这个事情;
interface MilkyTea{
public void buyMilkyTea();
}
第二步:第一个子类,顾客类。决定奶茶最终口味
class MilkyTeaTaste implements MilkyTea{
public void buyMilkyTea(){
System.out.println("要一杯巧克力口味的");
}
}
第三部,第二个子类,代理类,奶茶店员,完成奶茶的辅助操作
class MilkyTeaEmplyee implements MilkyTea{
private MilkyTea milktea;
public MilkyTeaEmplyee(MilkyTea milktea){
this.milktea = milktea;
}
//店员要做的相关操作
public void joinCondiments(){
System.out.println("加入调味品");
}
public void heatMilkyTea(){
System.out.println("加热奶茶");
}
public void packMilkTea(){
System.out.println("装入杯中");
}
//覆写接口方法:全程动作在此方法中完成
public void buyMilkyTea(){
this.milktea.buyMilkyTea();
this.joinCondiments();
this.heatMilkyTea();
this.packMilkTea();
}
}
下面是主类(终端客户端)中的操作
public class Test1{
public static void main(String[] args){
new MilkyTeaEmplyee(new MilkyTeaTaste()).buyMilkyTea();
}
}
到此,一个简单的代理模式就介绍完毕了,下面我将总结一下代理模式的相关特点及其本质
第一点::为什么在终端中店员类(代理类)里要传入一个顾客口味类?
因为,代理类做的只是奶茶制作过程当中的辅助操作,真正决定奶茶口味的,还是需要顾客来决定,所以必须在店员类里传入顾客口味;
第二点::为什么店员类中要实例化一个接口对象,而不是直接使用顾客的口味类对象?
因为如果直接实例化顾客口味对象的话,太局限,仅仅能造一个口味的,如果实例化一个接口,那么在代理类构造方法中传入顾客口味对象时会发生向上转型,不同的口味都可以使用这个辅助类,可以灵活实现这个功能;
第三点::为啥在主客户端中,实例化的是一个辅助子类?
因为,将要调用的是覆写之后的 buyMilkyTea() 操作。如果实例化客户口味类,就只剩一个 buyMilkyTea() 方法了。
下面是加入第二个(红豆的)口味后的:
//首先,写个接口
interface MilkyTea{
public void buyMilkyTea();
}
//然后就是第一个子类,决定什么口味的奶茶
class MilkyTeaTaste implements MilkyTea{
public void buyMilkyTea(){
System.out.println("要一杯巧克力口味的");
}
}
class MilkyTeaTaste2 implements MilkyTea{
public void buyMilkyTea(){
System.out.println("要一杯红豆口味的奶茶");
}
}
//下面事第二个子类(店员),用来辅助这个过程
class MilkyTeaEmplyee implements MilkyTea{
private MilkyTea milktea;
public MilkyTeaEmplyee(MilkyTea milktea){
this.milktea = milktea;
}
public void joinCondiments(){
System.out.println("加入调味品");
}
public void heatMilkyTea(){
System.out.println("加热奶茶");
}
public void packMilkTea(){
System.out.println("装入杯中");
}
public void buyMilkyTea(){
this.milktea.buyMilkyTea();
this.joinCondiments();
this.heatMilkyTea();
this.packMilkTea();
}
}
public class Test1{
public static void main(String[] args){
new MilkyTeaEmplyee(new MilkyTeaTaste()).buyMilkyTea();
new MilkyTeaEmplyee(new MilkyTeaTaste2()).buyMilkyTea();
}
}
最终结果::