从王者荣耀看设计模式(虚拟代理模式)
生活随笔
收集整理的這篇文章主要介紹了
从王者荣耀看设计模式(虚拟代理模式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
從王者榮耀看設計模式(虛擬代理模式)
一.簡介
王者榮耀游戲設置了很多種游戲模式,比如:王者模擬戰、無限亂斗、夢境大亂斗、火焰山大戰等。當從王者榮耀的主界面進入各類模式的界面時,由于網絡原因,會存在一定程度的延時(會有一個圈圈在主界面一直轉啊轉啊轉(??へ??╬)),直到加載完圖片,會跳轉到各模式界面。
模式動機
在本實例中,當圖片還沒有從網上下載完成,使用虛擬代理進行代替,具體表示為:在圖片沒有下載到本地顯示出來時,在GUI上顯示:“正在加載中……請稍后”
二.虛擬代理(作為創建開銷大的對象的代表)
虛擬代理是作為創建開銷大的對象的代表。虛擬代理經常直到我們真正需要一個對象的時候才創建它。當對象在創建前和創建中時,由虛擬代理來扮演對象的替身。對象創建后,代理就會將請求直接委托給對象。
三.結構圖
四.設計類圖
五.順序圖
六.ImageProxy如何工作
⑴. 我們創建一個用來顯示的ImageProxy代理,paintIcon()方法會被調用,而ImageProxy會產生線程取得圖像,并創建ImageIcon.
⑵. 在某個時間點,也就是圖片下載完成后,圖像被返回,ImageIcon被完整實例化。
⑶. 在ImageIcon被創建后,下次調用paintIcon時,代理就委托ImageIcon進行。
七.代碼實現
編寫ImageProxy代碼
package com.practice.VirtualProxy;import java.awt.Component; import java.awt.Graphics; import java.net.URL; import javax.swing.Icon; import javax.swing.ImageIcon;//實現Icon接口 public class ImageProxy implements Icon {ImageIcon imageIcon;URL imageURL;Thread retrievalThread;boolean retrieving = false;// 將圖片的URL傳入構造器中public ImageProxy(URL url) {imageURL = url;}// 在圖像加載完畢前,返回默認的寬和高// 圖像加載完畢后,裝給iamgeIcon處理public int getIconWidth() {if (imageIcon != null) {return imageIcon.getIconWidth();} else {return 800;}}public int getIconHeight() {if (imageIcon != null) {return imageIcon.getIconHeight();} else {return 600;}}// 當要在屏幕上繪制圖像時,就調用此方法public void paintIcon(final Component c, Graphics g, int x, int y) {// 如果已經有了icon,就畫出if (imageIcon != null) {imageIcon.paintIcon(c, g, x, y);} else {// 還沒有icon時,就顯示“加載中...”的消息g.drawString("游戲界面加載中,請稍后...", x + 300, y + 190);if (!retrieving) {retrieving = true;// 在這個線程中加載真正的icon圖像。注意,加載圖像和ImageIcon是同步(synchronous)// 也就是說,只有在加載完之后,ImageIcon構造器才會返回。這樣,我們的程序會耗在這里// 所以要把加載變成異步(asynchronous)的。retrievalThread = new Thread(new Runnable() { public void run() {try {imageIcon = new ImageIcon(imageURL, "GamePage");c.repaint();} catch (Exception e) {e.printStackTrace();}} });retrievalThread.start();}}}}編寫ImageComponent(用來放到frame布局中用來顯示圖片)
package com.practice.VirtualProxy;import java.awt.*; import javax.swing.*;class ImageComponent extends JComponent {private static final long serialVersionUID = 1L;private Icon icon;public ImageComponent(Icon icon) {this.icon = icon;}public void setIcon(Icon icon) {this.icon = icon;}public void paintComponent(Graphics g) {super.paintComponent(g);int w = icon.getIconWidth();int h = icon.getIconHeight();int x = (800 - w)/2;int y = (600 - h)/2;icon.paintIcon(this, g, x, y);} }測試代碼ImageProxyTestDrive
package com.practice.VirtualProxy;import java.net.*; import java.awt.event.*; import javax.swing.*; import java.util.*;public class ImageProxyTestDrive {ImageComponent imageComponent;JFrame frame = new JFrame("王者榮耀頁面加載器");JMenuBar menuBar; // 菜單欄JMenu menu; // 菜單 Hashtable<String, String> cds = new Hashtable<String, String>();public static void main (String[] args) throws Exception {new ImageProxyTestDrive();}public ImageProxyTestDrive() throws Exception{// 構造菜單項用的, key=CD名, value=URLcds.put("王者首頁", "https://graph.baidu.com/resource/126029c103ffff3795c2c01577338115.jpg");cds.put("王者模擬戰","https://graph.baidu.com/resource/126cb98ad7a209b65c44701577338030.jpg");cds.put("無限亂斗","https://graph.baidu.com/resource/12611c1da836e79b2398701577338223.jpg");cds.put("夢境大作戰","https://graph.baidu.com/resource/126a905124f61eaabb7ff01577338291.jpg");cds.put("火焰山大作戰","https://graph.baidu.com/resource/12694ce534e244577a20b01577338346.jpg");cds.put("克隆大作戰","https://graph.baidu.com/resource/12682b0f434812cf5613a01577338523.jpg");cds.put("契約之戰","https://graph.baidu.com/resource/126e137611a3bc598acc701577338585.jpg");// 設置初始的CD封面//URL initialURL = new URL((String)cds.get("Once<曾經>"));URL initialURL = new URL((String)cds.get("王者首頁"));// 建立菜單欄menuBar = new JMenuBar();menu = new JMenu("王者榮耀界面");menuBar.add(menu);frame.setJMenuBar(menuBar);for(Enumeration<String> e = cds.keys(); e.hasMoreElements();) {String name = (String)e.nextElement();JMenuItem menuItem = new JMenuItem(name);menu.add(menuItem); menuItem.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent event) {imageComponent.setIcon(new ImageProxy(getPicUrl(event.getActionCommand())));frame.repaint();}});}// set up frame and menusIcon icon = new ImageProxy(initialURL);imageComponent = new ImageComponent(icon);frame.getContentPane().add(imageComponent);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setSize(800,600);frame.setVisible(true);}URL getPicUrl(String name) {try {return new URL((String)cds.get(name));} catch (MalformedURLException e) {e.printStackTrace();return null;}} }八.源代碼下載
!從王者榮耀看設計模式
總結
以上是生活随笔為你收集整理的从王者荣耀看设计模式(虚拟代理模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux-2.6.34.1移植到TQ2
- 下一篇: 微型计算机中奇偶校验,奇偶校验位