简话设计模式之Proxy-Stub模式

本文深入探讨了设计模式中的Proxy-Stub模式,针对上一篇proxy模式实例进行了优化,详细阐述了如何在实际应用中提升代码的灵活性和可扩展性,尤其在Android开发中具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对上一篇的proxy模式中提到的例子进行优化如下:

package com.sean.mp3player;

import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;

public interface IPlayer1 {
	public void play();

	public void stop();

	public void getStatus();

	public static abstract class Stub extends Binder implements IPlayer1 {

		@Override
		protected boolean onTransact(int code, Parcel data, Parcel reply,
				int flags) throws RemoteException {
			// TODO Auto-generated method stub
			if (code == 1) {
				this.play();
			} else if (code == 2) {
				this.stop();
			} else if (code == 3) {
				this.getStatus();
			}
			return true;
		}

		public abstract void play();

		public abstract void stop();

		public abstract void getStatus();

		public static IPlayer1 asInterface(IBinder binder) {
			return new Proxy(binder);//从Stub中生成Proxy的实例,更加说明了二者的密切联系。
		}

		private static class Proxy implements IPlayer1 {

			private IBinder binder;

			Proxy(IBinder binder) {
				this.binder = binder;
			}

			@Override
			public void play() {
				// TODO Auto-generated method stub
				try {
					binder.transact(1, null, null, 0);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

			@Override
			public void stop() {
				// TODO Auto-generated method stub
				try {
					binder.transact(2, null, null, 0);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

			@Override
			public void getStatus() {
				// TODO Auto-generated method stub
				try {
					binder.transact(3, null, null, 0);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}

		}

	}
}


package com.sean.mp3player;

import android.content.Context;

public class Mp3Binder extends IPlayer1.Stub {

    private Context context;
    public Mp3Binder(Context context){
        this.context = context;
    }
    @Override
    public void play() {
        // TODO Auto-generated method stub
        System.out.println("---play---");
    }

    @Override
    public void stop() {
        // TODO Auto-generated method stub
        System.out.println("---stop---");
    }

    @Override
    public void getStatus() {
        // TODO Auto-generated method stub
        System.out.println("---getStatus---");
    }

}

 

对比优化之前的例子,似乎只是把Proxy中的代码和Adapter中的代码移到了IPlayer接口的内部而已,但这个改动意义重大,首先从逻辑意义上来说,具有统一性的代码放置到了一起,更重要的在于隐藏了Stub(Binder)中的这个onTransact()实现,也就是说即使我们不懂跨进程调用也可以使用这个调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值