楼主: 臧圩人

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

[复制链接]
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
11#
 楼主| 发表于 2010-4-8 18:07 | 只看该作者
5、虚拟代理(Virtual Proxy)模式实例(结合了状态模式)

/**
* 视频播放器
*
* @author zangweiren 2010-4-8
*
*/
public interface MediaPlayer {
        int getHeight();

        int getWidth();

        void play();
}

/**
* 视频播放器实现类
*
* @author zangweiren 2010-4-8
*
*/
public class MediaPlayerImpl implements MediaPlayer {

        @Override
        public int getHeight() {
                return 1024;
        }

        @Override
        public int getWidth() {
                return 768;
        }

        @Override
        public void play() {
                System.out.println("The vedio is playing...");
        }

}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
12#
 楼主| 发表于 2010-4-8 18:07 | 只看该作者
/**
* 视频播放器状态
*
* @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;
        }

        @Override
        public int getHeight() {
                return 800;
        }

        @Override
        public int getWidth() {
                return 600;
        }

        @Override
        public void play() {
                player.setState(player.getLoadingState());
                player.play();
        }

}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
13#
 楼主| 发表于 2010-4-8 18:08 | 只看该作者
/**
* 加载中状态
*
* @author zangweiren 2010-4-8
*
*/
public class LoadingState implements MediaPlayerState {

        private MediaPlayerProxy player;

        public LoadingState(MediaPlayerProxy player) {
                this.player = player;
        }

        @Override
        public int getHeight() {
                return 800;
        }

        @Override
        public int getWidth() {
                return 600;
        }

        @Override
        public 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();
        }

}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
14#
 楼主| 发表于 2010-4-8 18:08 | 只看该作者
/**
* 已加载状态
*
* @author zangweiren 2010-4-8
*
*/
public class LoadedState implements MediaPlayerState {
        private MediaPlayerProxy player;

        public LoadedState(MediaPlayerProxy player) {
                this.player = player;
        }

        @Override
        public int getHeight() {
                return 1024;
        }

        @Override
        public int getWidth() {
                return 768;
        }

        @Override
        public 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());
        }

}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
15#
 楼主| 发表于 2010-4-8 18:08 | 只看该作者
/**
* 视频播放器代理类
*
* @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;
        }

        @Override
        public 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;
        }

        @Override
        public int getWidth() {
                return state.getWidth();
        }

        @Override
        public void play() {
                state.play();
        }

        public void setState(MediaPlayerState state) {
                this.state = state;
        }

}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
16#
 楼主| 发表于 2010-4-8 18:08 | 只看该作者
测试程序:
/**
* 视频播放器测试程序
*
* @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());
        }

}

测试结果:
Height:800,Width:600
The video is loading,please wait...
The video is loading,please wait...
The video is loading,please wait...
Video loaded.
The video is playing...Height:1024,Width:768
The video is playing...Height:1024,Width:768
The video is playing...Height:1024,Width:768
The video is playing...Height:1024,Width:768
The video is playing...Height:1024,Width:768
Finished.
Height:800,Width:600

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
17#
 楼主| 发表于 2010-4-8 18:09 | 只看该作者
6、保护代理(Protect Proxy)模式实例

/**
* 用户管理类接口
*
* @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 {
        @Override
        public void addUser(String name) {
                System.out.println("User:" + name + " has been added.");
        }

        @Override
        public void deleteUser(String name) {
                System.out.println("User:" + name + "has been deleted.");
        }

        @Override
        public 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("--------------");
        }
}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
18#
 楼主| 发表于 2010-4-8 18:09 | 只看该作者
/**
* 管理员处理类
*
* @author zangweiren 2010-4-8
*
*/
public class AdminInvocationHandler implements InvocationHandler {
        private UserManager manager;

        public AdminInvocationHandler(UserManager manager) {
                this.manager = manager;
        }

        @Override
        public 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;
        }

}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
19#
 楼主| 发表于 2010-4-8 18:09 | 只看该作者
/**
* 普通用户处理类
*
* @author zangweiren 2010-4-8
*
*/
public class UserInvocationHandler implements InvocationHandler {
        private UserManager manager;

        public UserInvocationHandler(UserManager manager) {
                this.manager = manager;
        }

        @Override
        public 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;
        }

}

使用道具 举报

回复
论坛徽章:
56
2010年世界杯参赛球队:瑞士
日期:2010-02-26 11:04:012012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23版主2段
日期:2012-05-31 02:10:00版主2段
日期:2012-05-31 02:10:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07现任管理团队成员
日期:2012-10-18 18:22:36
20#
 楼主| 发表于 2010-4-8 18:10 | 只看该作者
/**
* 工具类
*
* @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));
        }
}

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表