生活随笔
收集整理的這篇文章主要介紹了
在王者荣耀角度下分析面向对象程序设计B中23种设计模式之原型模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
·
原型模式在王者榮耀中的應用
·
一、簡述
在王者榮耀中,克隆模式算是一個人氣比較高的娛樂模式了,因為該模式下雙方可以各有五個一模一樣的英雄,可以帶給玩家不同的游戲體驗,特別是有一些比較好玩的英雄,五個一起用就太強勢了!
在克隆模式中,雖然雙方五個英雄名字都一樣,但是,玩家又根據喜好及玩法不同可以給同一英雄佩戴不同的銘文、皮膚、召喚師技能等。
本實例就是運用王者榮耀中的克隆模式來說明程序設計模式中的原型模式的。設計者在設計時就已經考慮到,克隆模式中有很多的相同的英雄,如果每一個都實例出來浪費資源、時間和精力,同樣日后修改起來也算是繁瑣的。所以可以通過原型模式克隆出多個相同英雄,這樣就解決了上述讓人頭疼的問題。
具體而言,本實例是通過“深度克隆”實現玩家所有需求的。在設計時,已經考慮到:如果調用clone()方法的當前對象——本隊英雄擁有的成員變量——具體每個玩家對英雄、皮膚、銘文等的需求是一個對象,那么clone()方法僅僅復制了當前對象所擁有的對象的引用,并沒有復制這個對象所擁有的變量,這就是使clone()方法返回的新對象和當前對象擁有一個相同的對象,未能實現完全意義的復制。很顯然,當前對象的成員變量中可能還會有其它對象。所以使用clone()方法復制對象有許多細節需要用戶考慮,比如在重寫clone()方法時,必須也要對當前對象中的對象進行復制,這樣一來就涉及到了深度克隆的問題。于是乎,本實例Teammates.java和Enemies.java中,Prototype類和Serializable類的對象使用clone()方法復制自己,并處理了深度克隆問題。具體處理辦法及代碼運行效果圖見第三部分。
二、原型模式(Prototype Pattern)
原型模式理解:
高度概括:用原型實例指定創建對象的種類,并且通過復制這些原型創建新的對象。
在某些情況下,可能不希望反復使用類的構造方法創建許多對象,而是希望用該類創建一個對象后,以該對象為原型得到該對象的若干個復制品。也就是說,將一個對象定義為原型對象,要求該原型對象提供一個方法,使該原型對象調用此方法,可以復制一個和自己完全相同狀態的同類型對象,即該方法克隆原型對象得到一個新對象。
原型對象與以它為原型“克隆”出的新對象,可以分別獨立地變化。也就是說,原型對象改變其狀態,不會影響到以他為原型所“克隆”出的新對象,反之也一樣。
原型模式是從一個對象出發,得到一個和自己有相同狀態的新對象的成熟模式,該模式的關鍵是將一個對象定義為原型,并為其提供復制自己的方法。
原型模式結構中的三種角色:
①抽象原型(Prototype):一個接口,負責定義對象復制自身的方法(如果要提供深拷貝,則必須具有實現clone的規定);
②具體原型(ConcretePrototype):實現Prototype接口的類,具體原型實現抽象圓形中的方法,以便所創建的對象調用該方法復制自己;
③客戶(Client)角色:使用原型對象的客戶程序。
原型模式的UML類圖:
原型模式的優缺點:
優點:
①當創建類的新實例的代價更大時,使用原型模式復制一個已有的實例可以提高創建新實例的效率;
②可以動態地保存當前對象的狀態,在運行時可以隨時使用對象流保存當前對象的一個復制品;
③可以在運行時創建新的對象,而無需創建一系列類和繼承結構(Prototype模式克隆一個原型而不是請求一個工廠方法去產生一個新的對象);
④可以動態的添加、刪除原型的復制品;
⑤用類動態配置應用 一些運行時刻環境允許動態將類裝載到應用中;
缺點:
①每一個抽象原型Prototype的子類都必須實現clone操作,而實現clone函數可能會很困難。比如說,當所考慮的類已經存在時就難以新增clone操作,當內部包括一些不支持拷貝或有循環引用的對象時,實現克隆可能也會很困難的。
②需要為每一個類配備一個克隆方法,而且這個克隆方法需要對類的功能進行通盤考慮,這對全新的類來說并不是很難,但對已有的類進行改造時,不一定是一件容易的事情,必須修改其源代碼,違背了"開—閉原則"。
原型模式涉及的設計原則:
① 為交互對象之間的松耦合設計而努力;
② 軟件實體應該是可以擴展的,但是不可修改的。
原型模式的適用情景:
①程序需要從一個對象出發,得到若干個和其狀態相同,并可獨立變化其狀態的對象時;
②當對象的創建需要獨立于它的構造過程和表示時;
③一個類創建實例狀態不是很多,那么就可以將這個類的一個實例定義為原型,那么通過復制該原型得到新的實例可能比重新使用類的構造方法創建新實例更方便。
三、王者榮耀角度下實現原型模式結構圖及代碼
該原型模式下實現王者榮耀代碼的UML類圖
eclipse結構圖
主函數【應用(Application)】
Application.java
package angle_prototypePattern;import angle_prototypePattern.Teammates;
import angle_prototypePattern.Enemies;public class Application{public static void main(String args
[]){System.out
.println("【克隆模式】匹配成功!請您選擇英雄");System.out
.println("");System.out
.println("☆我方最終選定英雄“百里玄策”出戰!");System.out
.println("☆敵方最終選定英雄“夏侯惇”出戰!");System.out
.println("----------------------------------------------------");Teammates teammates
=new Teammates();teammates
.setSkill(new StringBuffer("治療"));teammates
.setSkin(new StringBuffer("囂狂之鐮"));System.out
.println("☆我方");System.out
.println("英雄“百里玄策”默認召喚師技能【"+teammates
.getSkill()+"】、皮膚【"+teammates
.getSkin()+"】");try{Teammates teammatesCopy1
=(Teammates)teammates
.cloneMe();Teammates teammatesCopy2
=(Teammates)teammates
.cloneMe();Teammates teammatesCopy3
=(Teammates)teammates
.cloneMe();Teammates teammatesCopy4
=(Teammates)teammates
.cloneMe();Teammates teammatesCopy5
=(Teammates)teammates
.cloneMe();teammatesCopy1
.setSkill(new StringBuffer("閃現"));teammatesCopy2
.setSkill(new StringBuffer("懲擊"));teammatesCopy3
.setSkill(new StringBuffer("狂暴"));teammatesCopy4
.setSkin(new StringBuffer("威尼斯狂歡"));teammatesCopy5
.setSkin(new StringBuffer("白虎志"));System.out
.println(" 玩家一保留默認召喚師技能【"+teammates
.getSkill()+"】、皮膚【"+teammates
.getSkin()+"】");System.out
.println(" 玩家二將召喚師技能改為【"+teammatesCopy1
.getSkill()+"】、皮膚【"+teammatesCopy4
.getSkin()+"】");System.out
.println(" 玩家三將召喚師技能改為【"+teammatesCopy2
.getSkill()+"】、皮膚【"+teammatesCopy5
.getSkin()+"】"); System.out
.println(" 玩家四將召喚師技能改為【"+teammatesCopy3
.getSkill()+"】、皮膚保留默認【"+teammates
.getSkin()+"】"); System.out
.println(" 玩家五將召喚師技能改為【"+teammatesCopy3
.getSkill()+"】、皮膚【"+teammatesCopy4
.getSkin()+"】"); }catch(CloneNotSupportedException exp
){} System.out
.println("---------------------------------------------------"); Enemies enemies
=new Enemies();enemies
.setSkill(new StringBuffer("治療"));enemies
.setSkin(new StringBuffer("不羈之風"));System.out
.println("☆敵方");System.out
.println("英雄“夏侯惇”默認召喚師技能【"+enemies
.getSkill()+"】、皮膚【"+enemies
.getSkin()+"】");try{Enemies enemiesCopy1
=(Enemies)enemies
.cloneMe();Enemies enemiesCopy2
=(Enemies)enemies
.cloneMe();Enemies enemiesCopy3
=(Enemies)enemies
.cloneMe();Enemies enemiesCopy4
=(Enemies)enemies
.cloneMe();Enemies enemiesCopy5
=(Enemies)enemies
.cloneMe();Enemies enemiesCopy6
=(Enemies)enemies
.cloneMe();Enemies enemiesCopy7
=(Enemies)enemies
.cloneMe();Enemies enemiesCopy8
=(Enemies)enemies
.cloneMe();enemiesCopy1
.setSkill(new StringBuffer("閃現"));enemiesCopy2
.setSkill(new StringBuffer("懲擊"));enemiesCopy3
.setSkill(new StringBuffer("終結"));enemiesCopy4
.setSkill(new StringBuffer("眩暈"));enemiesCopy5
.setSkin(new StringBuffer("朔風刀"));enemiesCopy6
.setSkin(new StringBuffer("乘風破浪"));enemiesCopy7
.setSkin(new StringBuffer("戰爭騎士"));enemiesCopy8
.setSkin(new StringBuffer("無限颶風號"));System.out
.println(" 玩家一保留默認召喚師技能【"+enemies
.getSkill()+"】、皮膚【"+enemies
.getSkin()+"】");System.out
.println(" 玩家二將召喚師技能改為【"+enemiesCopy1
.getSkill()+"】、皮膚【"+enemiesCopy6
.getSkin()+"】");System.out
.println(" 玩家三將召喚師技能改為【"+enemiesCopy3
.getSkill()+"】、皮膚【"+enemiesCopy7
.getSkin()+"】"); System.out
.println(" 玩家四將召喚師技能改為【"+enemiesCopy4
.getSkill()+"】、皮膚【"+enemiesCopy5
.getSkin()+"】"); System.out
.println(" 玩家五將召喚師技能改為【"+enemiesCopy2
.getSkill()+"】、皮膚【"+enemiesCopy8
.getSkin()+"】"); }catch(CloneNotSupportedException exp
){} }
}
抽象原型
Prototype.java
package angle_prototypePattern;public interface Prototype {public Object cloneMe() throws CloneNotSupportedException;
}
具體原型
Teammates.java
package angle_prototypePattern;import angle_prototypePattern.Prototype;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class Teammates implements Prototype,Serializable{StringBuffer skill
,skin
;public void setSkill(StringBuffer c
){skill
=c
;}public StringBuffer getSkill(){return skill
;}public void setSkin(StringBuffer c
){skin
=c
;}public StringBuffer getSkin(){return skin
;}public Object cloneMe() throws CloneNotSupportedException{ Object object
=null;try{ ByteArrayOutputStream outOne
=new ByteArrayOutputStream();ObjectOutputStream outTwo
=new ObjectOutputStream(outOne
);outTwo
.writeObject(this); ByteArrayInputStream inOne
=new ByteArrayInputStream(outOne
.toByteArray());ObjectInputStream inTwo
=new ObjectInputStream(inOne
);object
=inTwo
.readObject(); }catch(Exception event
){System.out
.println(event
);}return object
;}
}
Enemies.java
package angle_prototypePattern;import angle_prototypePattern.Prototype;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class Enemies implements Prototype,Serializable{StringBuffer skill
,skin
;public void setSkill(StringBuffer c
){skill
=c
;}public StringBuffer getSkill(){return skill
;}public void setSkin(StringBuffer c
){skin
=c
;}public StringBuffer getSkin(){return skin
;}public Object cloneMe() throws CloneNotSupportedException{ Object object
=null;try{ ByteArrayOutputStream outOne
=new ByteArrayOutputStream();ObjectOutputStream outTwo
=new ObjectOutputStream(outOne
);outTwo
.writeObject(this); ByteArrayInputStream inOne
=new ByteArrayInputStream(outOne
.toByteArray());ObjectInputStream inTwo
=new ObjectInputStream(inOne
);object
=inTwo
.readObject(); }catch(Exception event
){System.out
.println(event
);}return object
;}
}
運行結果截圖
更多設計模式在王者榮耀中的應用請點擊我的設計模式在王者榮耀中的應用專欄
歡迎留言,一起交流學習
感謝閱讀
END
總結
以上是生活随笔為你收集整理的在王者荣耀角度下分析面向对象程序设计B中23种设计模式之原型模式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。