1. 静态代理模式
条件:
代理类需要继承或实现被代理类, 且只重写需要特殊处理的方法。
代理类中需要有存放代理类的池子实例, 方便将数据返回到池子中。
用到的类:
User类, 类比connection对象
PRoxyIns类, User类的代理对象, 相当于connection对象的代理对象。
Instance类, 类比为数据源, 用来存储初始化的User对象
TestProxy: 测试类
静态代理给我的感觉,就是继承父类, 重写父类的方法。 改变父类原有的行为
User类:
package com.cez.study.bean;/** * @desc: user对象, 类比connection对象 * @auth: zona * 2017年3月5日 下午1:29:56 */public class User { private String name; private String passWord; public User() { super(); // TODO Auto-generated constructor stub } public User(String name, String password) { super(); this.name = name; this.password = password; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [name=" + name + ", password=" + password + "]"; } /** * * @desc: 创建user对象, 类比创建connection对象 * @auth: zona * 2017年3月5日 下午2:34:01 * @return */ public User createUser() { return new User("name", "password"); } /** * * @desc: 销毁user对象, 类比关闭connection链接 * @auth: zona * 2017年3月5日 下午2:34:13 * @param user */ public void close(User user) { user = null; } /** * * @desc: 该方法不需要什么特殊操作, 子类就不需要复写该方法了 * @auth: zona * 2017年3月5日 下午2:40:56 * @return */ public String say() { return "my name is "+name+", password is "+password; }}ProxyIns类:
package com.cez.study.proxy.statics;import java.util.List;import com.cez.study.bean.User;/** * @desc: User类的代理对象, 相当于connection对象的代理对象。 * @auth: zona * 2017年3月5日 下午1:27:55 */public class ProxyIns extends User{ // 获取user对象的池, 用于获取、返还user对象 private Instance ins = Instance.getInstanceIns(); @Override public User createUser() { return ins.creatUser(); } /** * 销毁user方法, 实际是把该user对象,放回到池中。 */ @Override public void close(User user) { ins.recoverUser(user); } /** * * @desc: 获取可用的user对象集合 * @auth: zona * 2017年3月5日 下午2:43:02 * @return */ public List<User> getAbleuser() { return ins.getAbleuser(); } }Instance类:
package com.cez.study.proxy.statics;import java.util.ArrayList;import java.util.List;import com.cez.study.bean.User;/** * @desc: 本类可以类比为数据源, 用来存储初始化的链接 * @auth: zona * 2017年3月5日 下午1:28:39 */public class Instance { private static List<User> userList = new ArrayList<User>(); // 初始化池 static { if(userList.isEmpty()) { for (int i = 0; i < 10; i++) { userList.add(new User("name"+i, "pwd"+i)); } } } /** * * @desc: 获取user对象 * @auth: zona * 2017年3月5日 下午2:39:23 * @return */ public User creatUser() { if(userList.size() != 0) { return userList.get(0); } return null; } /** * * @desc: 将使用后的user对象, 放回到连接池 * @auth: zona * 2017年3月5日 下午2:31:52 * @param user */ public void recoverUser(User user) { userList.add(user); } /** * * @desc: 获取现在可用的user对象集合 * @auth: zona * 2017年3月5日 下午2:32:15 * @return */ public List<User> getAbleuser() { return userList; } //---> 将该池设置为单例 private Instance() {} private static class InstanceIns{ private static Instance instance = new Instance(); } public static Instance getInstanceIns() { return InstanceIns.instance; } }TestProxy类:
package com.cez.study.proxy.statics;import java.util.ArrayList;import java.util.List;import com.cez.study.bean.User;/** * @desc: 测试类 * @auth: zona * 2017年3月5日 下午1:52:58 */public class TestProxy { public static void main(String[] args) { name(); name(); } public static void name() { ProxyIns proxyIns = new ProxyIns(); List<User> userList = new ArrayList<User>(); for (int i = 0; i < 11; i++) { User user = proxyIns.createUser(); List<User> innerList = proxyIns.getAbleuser(); System.out.println(user+", 剩余可用实例size:"+innerList.size()+", 实例:"+innerList); if(user !=null) userList.add(user); } for (int i = 0; i < userList.size(); i++) { proxyIns.close(userList.get(i)); List<User> innerList = proxyIns.getAbleuser(); System.out.println("剩余可用实例size:"+innerList.size()+", 实例:"+innerList); } }}
新闻热点
疑难解答