首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

《Head First设计形式》阅读笔记.第十一章

2012-10-09 
《Head First设计模式》阅读笔记.第十一章1、代理(Proxy)模式部分实现RMI(远程方法调用)的步骤:-------------

《Head First设计模式》阅读笔记.第十一章
1、代理(Proxy)模式部分

实现RMI(远程方法调用)的步骤:
---------------------------import java.lang.reflect.*;public class NonOwnerInvocationHandler implements InvocationHandler { PersonBean person; public NonOwnerInvocationHandler(PersonBean person){ this.person = person; } public Object invoke(Object proxy, Method method, Object[] args) throws IllegalAccessException{ try{ if(method.getName().startsWith("get")){ return method.invoke(person,args); }else if(method.getName().equals("setHotOrNotRating")){ return method.invoke(person,args); }else if(method.getName().startsWith("set")){ throw new IllegalAccessException(); } } catch (InvocationTargetException e){ e.printStackTrace(); } return null; }}---------------------------

Sharpen your pencil解答:

---------------------------PersonBean getNonOwnerProxy(PersonBean person){  return (PersonBean)Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(),new NonOwnerInvocationHandler());}PersonBean getProxy(PersonBean person,InvocationHandler handler){  if(handler instanceof OwnerInvocationHandler){    return getOwnerProxy(person);  }else if(handler instanceof NonOwnerInvocationHandler){    return getNonOwnerProxy(person);  }}---------------------------


连连看解答:
/** * 远程接口 * * @author zangweiren 2010-4-8 * */public interface HelloRemote extends Remote {String sayHello() throws RemoteException;}/** * 远程服务实现类 * * @author zangweiren 2010-4-8 * */public class HelloImpl extends UnicastRemoteObject implements HelloRemote {private static final long serialVersionUID = -5554845400316615009L;public static void main(String[] args) {try {HelloRemote helloRemote = new HelloImpl();Naming.rebind("HelloRemote", helloRemote);} catch (RemoteException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();}}public HelloImpl() throws RemoteException {}@Overridepublic String sayHello() throws RemoteException {return "Hello,world.I am zangweiren.";}}/** * 远程服务客户端 * * @author zangweiren 2010-4-8 * */public class HelloClient {public static void main(String[] args) {try {HelloRemote helloRemote = (HelloRemote) Naming.lookup("rmi://127.0.0.1/HelloRemote");String words = helloRemote.sayHello();System.out.println(words);} catch (MalformedURLException e) {e.printStackTrace();} catch (RemoteException e) {e.printStackTrace();} catch (NotBoundException e) {e.printStackTrace();}}}

4、远程代理(Remote Proxy)模式实例

/** * 服务器远程接口 *  * @author zangweiren 2010-4-8 *  */public interface ServerRemote extends Remote {void shutdown() throws RemoteException;void startup() throws RemoteException;}/** * 服务器实现类 *  * @author zangweiren 2010-4-8 *  */public class ServerImpl extends UnicastRemoteObject implements ServerRemote {private static final long serialVersionUID = -1466325816915299894L;public static void main(String[] args) {ServerRemote server;try {server = new ServerImpl();Naming.rebind("ServerRemote", server);} catch (RemoteException e) {e.printStackTrace();} catch (MalformedURLException e) {e.printStackTrace();}}public ServerImpl() throws RemoteException {}@Overridepublic void shutdown() throws RemoteException {System.out.println("The server is shutdown.");}@Overridepublic void startup() throws RemoteException {System.out.println("The server is running...");}}/** * 远程代理客户端测试程序 *  * @author zangweiren 2010-4-8 *  */public class TestServer {public static void main(String[] args) {try {ServerRemote server = (ServerRemote) Naming.lookup("ServerRemote");server.startup();server.shutdown();} catch (MalformedURLException e) {e.printStackTrace();} catch (RemoteException e) {e.printStackTrace();} catch (NotBoundException e) {e.printStackTrace();}}}


测试结果:

/** * 视频播放器 * * @author zangweiren 2010-4-8 * */public interface MediaPlayer {int getHeight();int getWidth();void play();}/** * 视频播放器实现类 * * @author zangweiren 2010-4-8 * */public class MediaPlayerImpl implements MediaPlayer {@Overridepublic int getHeight() {return 1024;}@Overridepublic int getWidth() {return 768;}@Overridepublic void play() {System.out.println("The vedio is playing...");}}/** * 视频播放器状态 * * @author zangweiren 2010-4-8 * */public interface MediaPlayerState extends MediaPlayer {}/** * 未加载状态 * * @author zangweiren 2010-4-8 * */public class NotLoadedState implements MediaPlayerState {private MediaPlayerProxy player;public NotLoadedState(MediaPlayerProxy player) {this.player = player;}@Overridepublic int getHeight() {return 800;}@Overridepublic int getWidth() {return 600;}@Overridepublic void play() {player.setState(player.getLoadingState());player.play();}}/** * 加载中状态 * * @author zangweiren 2010-4-8 * */public class LoadingState implements MediaPlayerState {private MediaPlayerProxy player;public LoadingState(MediaPlayerProxy player) {this.player = player;}@Overridepublic int getHeight() {return 800;}@Overridepublic int getWidth() {return 600;}@Overridepublic void play() {for (int i = 0; i < 3; i++) {System.out.println("The video is loading,please wait...");}System.out.println("Video loaded.");player.setState(player.getLoadedState());player.play();}}/** * 已加载状态 * * @author zangweiren 2010-4-8 * */public class LoadedState implements MediaPlayerState {private MediaPlayerProxy player;public LoadedState(MediaPlayerProxy player) {this.player = player;}@Overridepublic int getHeight() {return 1024;}@Overridepublic int getWidth() {return 768;}@Overridepublic void play() {for (int i = 0; i < 5; i++) {System.out.println("The video is playing...Height:"+ player.getHeight() + ",Width:" + player.getWidth());}System.out.println("Finished.");player.setState(player.getNotLoadedState());}}/** * 视频播放器代理类 * * @author zangweiren 2010-4-8 * */public class MediaPlayerProxy implements MediaPlayer {private MediaPlayerState notLoaded;private MediaPlayerState loading;private MediaPlayerState loaded;private MediaPlayerState state;public MediaPlayerProxy() {notLoaded = new NotLoadedState(this);loading = new LoadingState(this);loaded = new LoadedState(this);state = notLoaded;}@Overridepublic int getHeight() {return state.getHeight();}public MediaPlayerState getLoadedState() {return loaded;}public MediaPlayerState getLoadingState() {return loading;}public MediaPlayerState getNotLoadedState() {return notLoaded;}public MediaPlayerState getState() {return state;}@Overridepublic int getWidth() {return state.getWidth();}@Overridepublic void play() {state.play();}public void setState(MediaPlayerState state) {this.state = state;}}测试程序:/** * 视频播放器测试程序 * * @author zangweiren 2010-4-8 * */public class TestMediaPlayer {public static void main(String[] args) {MediaPlayer player = new MediaPlayerProxy();System.out.println("Height:" + player.getHeight() + ",Width:"+ player.getWidth());player.play();System.out.println("Height:" + player.getHeight() + ",Width:"+ player.getWidth());}}

测试结果:
/** * 用户管理类接口 * * @author zangweiren 2010-4-8 * */public interface UserManager {public abstract void addUser(String name);public abstract void deleteUser(String name);public abstract void updateUser(String name,HashMap<String, String> properties);}/** * 用户管理类 * * @author zangweiren 2010-4-8 * */public class UserManagerImpl implements UserManager {@Overridepublic void addUser(String name) {System.out.println("User:" + name + " has been added.");}@Overridepublic void deleteUser(String name) {System.out.println("User:" + name + "has been deleted.");}@Overridepublic void updateUser(String name, HashMap<String, String> properties) {System.out.println("User:" + name + "has been updated.");System.out.println("Properties:");Iterator<String> keys = properties.keySet().iterator();String key;while (keys.hasNext()) {key = keys.next();System.out.println(key + "=" + properties.get(key));}System.out.println("--------------");}}/** * 管理员处理类 * * @author zangweiren 2010-4-8 * */public class AdminInvocationHandler implements InvocationHandler {private UserManager manager;public AdminInvocationHandler(UserManager manager) {this.manager = manager;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws IllegalAccessException {try {if (method.getName().equals("addUser")) {return method.invoke(manager, args);} else if (method.getName().equals("updateUser")) {return method.invoke(manager, args);} else if (method.getName().equals("deleteUser")) {return method.invoke(manager, args);}} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return null;}}/** * 普通用户处理类 * * @author zangweiren 2010-4-8 * */public class UserInvocationHandler implements InvocationHandler {private UserManager manager;public UserInvocationHandler(UserManager manager) {this.manager = manager;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws IllegalAccessException {try {if (method.getName().equals("addUser")) {throw new IllegalAccessException();} else if (method.getName().equals("updateUser")) {return method.invoke(manager, args);} else if (method.getName().equals("deleteUser")) {throw new IllegalAccessException();}} catch (IllegalArgumentException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return null;}}/** * 工具类 * * @author zangweiren 2010-4-8 * */public class UserManagerUtils {public static UserManager getAdminProxy(UserManager manager) {return (UserManager) Proxy.newProxyInstance(manager.getClass().getClassLoader(), manager.getClass().getInterfaces(),new AdminInvocationHandler(manager));}public static UserManager getUserProxy(UserManager manager) {return (UserManager) Proxy.newProxyInstance(manager.getClass().getClassLoader(), manager.getClass().getInterfaces(),new UserInvocationHandler(manager));}}/** * 测试类 * * @author zangweiren 2010-4-8 * */public class TestUserManager {public static void main(String[] args) {UserManager manager = new UserManagerImpl();UserManager admin = UserManagerUtils.getAdminProxy(manager);admin.addUser("Jim");HashMap<String, String> properties = new HashMap<String, String>();properties.put("Gender", "male");properties.put("Age", "28");admin.updateUser("Jim", properties);admin.deleteUser("Jim");System.out.println();UserManager user = UserManagerUtils.getUserProxy(manager);try {user.addUser("Lily");} catch (Exception e) {System.out.println("Can't add User!");}properties = new HashMap<String, String>();properties.put("Gender", "female");properties.put("Age", "26");user.updateUser("Lily", properties);try {user.deleteUser("Lily");} catch (Exception e) {System.out.println("Can't delete User!");}}}

测试结果:
引用User:Jim has been added.
User:Jimhas been updated.
Properties:
Age=28
Gender=male
--------------
User:Jimhas been deleted.

Can't add User!
User:Lilyhas been updated.
Properties:
Age=26
Gender=female
--------------
Can't delete User!

热点排行