Java的设计模式 之 简单的代理模式

本文通过两种方式介绍了代理模式的实现:一种是通过继承,另一种是通过代理。重点讲解了如何利用代理模式实现在原有方法调用前后增加额外操作的功能,并对比了两种实现方式的优劣。
下面是简单的代码外加一些个人的理解
代理模式的关键在于代理类和被代理类需要实现同一个接口
代理模式实现的时候是不需要记住实现接口类的名称,仅仅需要记住接口的名称即可,通过不同的接口来实现不同的代理类。
此代码实现的目的:在已有的输出结果的之前和结束的位置上输出其他的信息。如下述的输出:
    //正常的输出结果:
    System.out.println("run ......");


    //要实现的样式:
    xxxxxxxxx;        //(其中xxxx表示的是为任意的输出)
    System.out.println("run .......");
    xxxxxxxxx;        //(其中xxxx同正常输出之前的输出)
要像实现上述的方法有两种办法:

方法一:(通过继承来输出上述的样式)

    //使用继承实现上述的要求
    //定义一个在LogProxy
    interface Moveable{
    public void move();
}


class Demo implements Moveable{
    public void move(){
        System.out.println("run........");
    }
}

class LogProxy extends Demo {
    public void move(){
        System.out.println("Car Log start ........");
        super.move();
        System.out.println("Car Log end ..........");
    }
}


class Test{
    public static void main(String[] args){
        LogProxy lp  = new LogProxy ();
        
        lp.move();
    }
}
使用上述代码的可以实现想要实现的结果,但是缺点是,想要嵌套多个类似的输出结果的话,需要在继承多个类,实现起来不方便。

方法二:(通过代理的方式来实现要求)

在写代码之前需要理解一个概念就是聚合:我通过查看资料和视频简单理解一下聚合的含义是在一个类中包含处除此类外的另一个类。
import java.util.Random;

interface Moveable{
    public void move();
}

class Tank implements Moveable{
    public void move(){
        System.out.println("run.....");
        
        try{
            Thread.sleep(new Random().nextInt(10000));                //此处的含义是将该线程停止一段时间
        }catch(Exception e){
            System.out.println(e);
        }
    }
}

class TankTimeProxy implements Moveable{
    Moveable t;
    
    public TankTimeProxy(Moveable m){
        super();
        this. t = m;
    }
    
    public void move(){
        System.out.println("Time Proxy begin .....");
        t.move();
        System.out.println("Time Proxy end .......");
    }
}

class TankLogProxy implements Moveable{
    Moveable t ;
    
    public TankLogProxy(Moveable m){
        super();
        this.t = m;
    }
    
    public void move(){
        System.out.println("Log Proxy begin......");
        
        t.move();
        
        System.out.println("Log Proxy end .......");
    }
}

class Demo{
        public static void main(String[] args){
            Moveable m = new Tank();
        
        TankLogProxy tlp = new TankLogProxy(m);
        
        TankTimeProxy ttp = new TankTimeProxy(tlp);
        
        ttp.move();
    }
}

//使用代理实现开头的要求的一个条件是需要将所要使用到的类都需要实现一个统一的接口,上述代码中实现的接口是Moveable.

转载于:https://www.cnblogs.com/gxcstyle/p/8728146.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值