GOF23设计模式之静态代理方式实现之经典

GOF23设计模式之静态代理模式实现之经典

/**
 * 抽象就角色,定义代理角色和真实角色的公共对外方法
 * 时间:2015年4月4日18:45:00
 * 在这个例子中,抽象角色起着规范代理角色和真实角色的作用。
 * 其中具有方法,面谈,签合同收预付款,预订机票,唱歌,收尾款
 */
package com.bjsxt.cn.proxy.staticProxy;
public interface Star {
 void confer();
 void signContract();
 void bookTicket();
 void sing();
 void collectMoney();
}


/**
 * 相当于真实角色,实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色使用
 * 也就是这个类的对象(例如周杰伦),他要实现他的sing方法,这是他的药关注的业务逻辑。这个实现了的
 * sing方法是为了供代理角色使用的
 * 
 * 只需要关注真正的业务逻辑,其他方法是不用关注的
 */
package com.bjsxt.cn.proxy.staticProxy;
public class RealStar implements Star {
 /**
  * 面谈
  */
 @Override
 public void confer() {
  System.out.println("RealStar.confer()");
 }
 @Override
 public void signContract() {
  System.out.println("RealStar.signContract()");
  
 }
 @Override
 public void bookTicket() {
  System.out.println("RealStar.bookTicket()");
 }
 @Override
 public void sing() {
  System.out.println("RealStar(真实角色:周杰伦).sing()");
  System.out.println("真实角色在唱歌");
  
 }
 @Override
 public void collectMoney() {
  System.out.print("RealStar.collectMoney()");
  
 }
 
}


/**
 * 代理角色:
 *   实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑来实现抽象方法,并可以增加自己的方法
 *   这句话的意思就是,代理角色中方法的实现是通过调用了真实角色的业务逻辑(即也就是真实角色的方法)
 *   从而实现了自己的方法。
 *  
 *   这样的实现方式和具有将统一的流程控制放到代理角色中处理。(换言之,我作为代理角色,即可以安排自己需要安排
 *   的事务,相应的我可以通过调用真实角色的业务逻辑来实现我所不能实现的东西,但这都在代理角色的内部得到实现
 *   也就是把统一的流程控制都放到了代理角色中了)
 * 
 *   PS:可以用ctrl+shift+M/Ctrl+Shift+o/Ctrl+1导入相应的包
 */
package com.bjsxt.cn.proxy.staticProxy;
public class Proxy implements Star {
 private Star realStar;
 
 /**
  * 代理角色要有真实角色的引用,这样可以方便的访问真实角色的业务逻辑
  * 通过构造函数把真实角色的引用传入
  * @param realStar
  */
 public Proxy(Star realStar) {
  super();
  this.realStar = realStar;
 }
 @Override
 public void confer() {
  System.out.println("Proxy.confer()");
  
 }
 @Override
 public void signContract() {
  System.out.println("Proxy.signContract()");
  
 }
 @Override
 public void bookTicket() {
  System.out.println("Proxy.bookTiciket()");
  
 }
 /**
  * 代理角色的其他方法,自己就可以实现,而sing方法需要调用艺人的唱歌功能。这也就是,代理角色作为
  * 真实角色的代理,通过真实角色的业务逻辑来是想抽象角色的方法,并可以增加自己的方法
  */
 @Override
 public void sing() {
  this.state();
  this.confer();
  this.signContract();
  this.bookTicket();
  
  realStar.sing();
  
  this.collectMoney();
  
 }
 @Override
 public void collectMoney() {
  System.out.println("Proxy.collectMoney()");
  
 }
 
 public void state() {
  System.out.println("我们的艺人才高八斗。学富五车");
 }
}


/**
 * 时间:2015年4月4日19:16:52
 * 该代码是测试类,用于测试静态代理模式的实现
 * client相当于客户,客户想让杰伦唱歌,只需要找到杰伦代理即可
 */
package com.bjsxt.cn.proxy.staticProxy;
public class Client {
 public static void main(String[] args) {
  Star star = new RealStar();
  Proxy proxy = new Proxy(star);//把杰伦传给代理
  
  proxy.sing();//表面调用了代理的sing方法,但其实内部由proxy调用了明星的具体实现方法
 }
}
/*
 * 
 * 
    我们的艺人才高八斗。学富五车
 Proxy.confer()
 Proxy.signContract()
 Proxy.bookTiciket()
 RealStar(真实角色:周杰伦).sing()
 真实角色在唱歌
 Proxy.collectMoney()
 * 
 * 
 *
 */