代理模式

来源:互联网 发布:淘宝主播的东西可靠吗 编辑:程序博客网 时间:2024/04/30 09:15

定义:

 为其他的对象提供一种代理,以控制这个对象的访问

使用场景:

                 当无法直接访问某个对象的时候可以通过代理对象间接访问。
   
  活在当下,直播离我们越来越近,网红也越来越多,能够认识的美女的机会也越来越多。一般有名气的网红
丝少说破万,多着上百万的粉丝订阅量。想近距离接触网红的人很多很多,然而不是所有的奶茶都叫优乐美,又
不是所有的人都可以认识主播、认识网红,你如果想要认识一些有知名度的网红(张琪格就成为魅族手机新闻发布
会做过推广),粉丝那么多,如果人人都想要和主播面基,那主播岂不是要疯掉(网红也不可能有那么多的时
间),于是经纪人便替主播审核资质(是否有足够的的money、是否足够的帅)

简单实现:

/** * 委托  对象 * */public class Anchor implements Sudject{@Overridepublic void eat() {System.out.println(" 和 网红一起  吃饭 ");}@Overridepublic void play() {System.out.println("  和网红一起  打游戏   ");}}

/** * 代理对象 * */public class Xiaoming implements Sudject{Anchor anchor;    public Xiaoming(Anchor anchor) {  this.anchor=anchor;    }@Overridepublic void eat() {anchor.eat();}@Overridepublic void play() {anchor.play();}}

public interface Sudject {public void eat();//吃饭 public void play();//娱乐}
public class Main {public static void main(String[] args) {Anchor anchor=new Anchor();Xiaoming xiaoming=new Xiaoming(anchor);xiaoming.eat();xiaoming.play();}}

 运行结果:
  和 网红一起  吃饭 
 
和网红一起  打游戏  
总结:
通过代码你应该也明白了 代理模式的使用,主要就是将真实对象的方法委托给代理对象(代理对象存在委托 

类的实例)。

写到这里,你或许会发现这里存在的一个问题:代理类里面实现了委托了的实例,一个代理类为一个委托服

务,降低的程序的耦合性。如果网红要和别的屌丝面基得重新构造代理,增加了工作量。于是动态代理便产了。

用于解决代理与委托之间的一对多问题。


动态代理:

java提供一个便捷的动态代理接口(InvocationHandler),通过invoke方法调用具体的被代理方法。

代码示例:
/** * 委托  * */public class Anchor implements ISudject{@Overridepublic void Other() {System.out.println("    一起 做 喜欢做的事情    ");}@Overridepublic void Singer() {System.out.println("    一起 做 唱歌     ");}}

public interface ISudject {public void Other();public void Singer();}

/** * 动态代理  * */public class MProxy implements InvocationHandler{Object object;public Object GetInstance(Object object) {    this.object = object;         //取得代理对象        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);      }    @Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 得到被代理的 对象 Object result=method.invoke(object, args);return result;}}


public class Main {public static void main(String[] args) {MProxy proxy=new MProxy();ISudject anchor=(ISudject) proxy.GetInstance(new Anchor());anchor.Singer();anchor.Other();}}

运行结果就不展示了 ,如果你喜欢我的文章就请来一波关注吧。


0 0
原创粉丝点击