JavaSE阶段必须掌握的23种设计模式之一:代理设计模式

首先我们应该理解一下代理模式的概念:
一个接口,两个子类分别实现它,一个子类全程做的是辅助,框架的作用,另一个做的是真正的要做的事
下面我要举个例子来解释一下我对代理模式的理解:
假设客户要去买一杯奶茶,奶茶店员并不知道他要的什么口味的,红豆、巧克力、香草、原味、芒果、蓝莓等等,店员要做的就是加入各种口味的调味品,加热奶茶,并且装入奶茶杯中,最后与客户达成交易。在这个例子中,客户跟店员就是两个子类,前者完成主要业务(决定奶茶的最终口味),后者完成相关辅助业务,核心功能就是买奶茶,是个接口,下面先实现一下功能。
首先写个接口,简单来说就是:买奶茶这个事情;

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();
    }
}

最终结果::
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值