场景:群主有禁言和解散群的操作,群管理代理群主可以将群成员禁言,但是不能解散群。
先来个类图
群管理代码:
package com.freshbin.pattern.proxy.myexample.group;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import com.sun.org.apache.bcel.internal.generic.NEW;
/**
* GroupOwner
*
* @author freshbin
* @date 2019年1月11日 下午7:42:42
*/
public class GroupManager implements InvocationHandler {
private static final String putAllMembersToBlackHouse = "putAllMembersToBlackHouse";
private static final String DELETE = "delete";
Group group;
public GroupManager(Group group) {
this.group = group;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.getName().equals(putAllMembersToBlackHouse)) {
return method.invoke(group, args);
} else if (method.getName().startsWith(DELETE)){
System.out.println("你没有该权限!请往群主收款账号打几百万先!");
return new IllegalAccessException();
}
return null;
}
}
群主类代码:
package com.freshbin.pattern.proxy.myexample.group;
/**
* GroupOwner
*
* @author freshbin
* @date 2019年1月11日 下午7:42:42
*/
public class GroupOwner implements Group {
@Override
public void putAllMembersToBlackHouse(String user) {
System.out.println(user + "将所有群成员关到小黑屋里!");
}
@Override
public void deleteGroup() {
System.out.println("解散群!");
}
}
群接口:
package com.freshbin.pattern.proxy.myexample.group;
/**
* Group接口
*
* @author freshbin
* @date 2019年1月11日 下午7:40:41
*/
public interface Group {
void putAllMembersToBlackHouse(String user);
void deleteGroup();
}
service类:
package com.freshbin.pattern.proxy.myexample.group;
import java.lang.reflect.Proxy;
/**
* GroupService.java
*
* @author freshbin
* @date 2019年1月11日 下午8:01:38
*/
public class GroupService {
public GroupService() {
Group groupManager = getGroupManager(new GroupOwner());
groupManager.putAllMembersToBlackHouse("群管理");
groupManager.deleteGroup();
System.out.println("===============");
Group groupOwner = new GroupOwner();
groupOwner.putAllMembersToBlackHouse("群主");
groupOwner.deleteGroup();
}
private Group getGroupManager(Group group) {
return (Group) Proxy.newProxyInstance(group.getClass().getClassLoader(),
group.getClass().getInterfaces(), new GroupManager(group));
}
}
客户端主类:
package com.freshbin.pattern.proxy.myexample;
import com.freshbin.pattern.proxy.myexample.group.GroupService;
/**
* 代理模式
*
* @author freshbin
* @date 2019年1月11日 下午7:39:59
*/
public class ProxyPatternDemo {
public static void main(String[] args) {
GroupService groupService = new GroupService();
}
}
效果图: