⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 电子版代码.txt

📁 用策略模式和观察者模式混合设计的一个游戏模拟
💻 TXT
字号:
/****************************************************************/
public interface Subject {
	 //注册成为观察者
     public void registerObserver(myObserver o);
     //移除观察者
     public void removeObserver(myObserver o);
     //通知观察者
     public void notifyObservers(WeaponBehavior wb);
}
/****************************************************************/
public interface myObserver {
    //更新观察者状态
public void update(WeaponBehavior wb);
}
/****************************************************************/
public abstract class Character1 {                 
    //身份的标志
    String name;
    public Character1() {}
    WeaponBehavior weaponBehavior;
     //可以灵活地使用封装的算法簇---武器
    void setWeapon(WeaponBehavior wb){
    	weaponBehavior = wb;
    }
    //获取身份的标志
    public  String getName(){
    	return this.name;
    }
    //使用现在拥有的武器
    void fight(){
    	weaponBehavior.useWeapon();
    }
}//类Character1的结束
/****************************************************************/
import java.util.*;
//国王实现了Subject接口,继承了Character1
public class King  extends Character1 implements Subject {
     //用来记录国王的跟随者,也就是观察者
     //在构造器中建立的
     private ArrayList observers; 
      public King(){
      //初始化国王使用的武器
      weaponBehavior = new SwordBehavior();
      observers = new ArrayList();
      //身份的标记
      //Character1的属性
      name = "king";
    }
    //国王召集军队
    
    public void callOnArmy(){
    	System.out.println("now comet to your king,i need you!");
    }
    //注册成为国王的追随者
    //也就是成为观察者
    public void registerObserver(myObserver o){
       observers.add(o);
    }
    //国王放弃追随者
    //也就是放弃观察者
    public void removeObserver(myObserver o){
    	int i = observers.indexOf(o);
    	if(i >= 0){
    	   observers.remove(i);
    	   }
    }//方法removeObserver的结束
    //国王指挥统一作战,发布命令
    //通过主题通知观察者的功能实现
    public void notifyObservers(WeaponBehavior wb){
    	for(int i = 0; i < observers.size(); i++){
    		myObserver observer = (myObserver)observers.get(i);
    		observer.update(wb);
    	}//for结束
    }//方法notifyObservers的结束
 }//类King的结束
/****************************************************************/
//王后只是继承了Charater1,不用实现myObserver接口,因为国王很疼爱她
//王国说他是她的仆人
public class Queen extends Character1{
 //初始化身份标志
    public Queen() {
    	name = "queen";
    }
    //一旦妖怪把王后掳走,使用此方法
    public void askHelp(){
    	System.out.println("king,where are you?,i am missing you," + 
    		"the troll is horrible,come to rescue me please!");
    }//askHelp方法的结束
 }//Queen类的结束
/****************************************************************/
//步兵继承了Character1,实现了myObserver接口
public class Infantry extends Character1 implements myObserver {
    //初始化使用的武器和身份标记
   public Infantry() {
    	weaponBehavior = new SpearBehavior();
    	name = "infantry";
    }
    //更新使用的武器
    public void update(WeaponBehavior wb){
    	setWeapon(wb);
    }
}//类Infantry的结束
/****************************************************************/
//骑士继承了Character1,实现了myObserver接口
public class Knight extends Character1 implements myObserver {
   //初始化使用的武器和身份标记
    public Knight() {
    	weaponBehavior = new KnifeBehavior();
    	name = "knight";
    }//构造器Knight的结束
    //更新使用的武器
    public void update(WeaponBehavior wb){
    	setWeapon(wb);
    }
 }//类Knight的结束
/****************************************************************/
public class Bowman extends Character1 implements myObserver{
    //构造器内初始化默认使用武器和身份标记
    public Bowman() {
    	weaponBehavior = new BowAndArrowBehavior();
    	name = "bowman";
     }
    //更新使用的武器
    public void update(WeaponBehavior wb){
    	setWeapon(wb);
    }
}//类Bowman的结束
/***************************************************************/
public class Troll extends Character1 {
    //构造器内初始化妖怪使用的武器和身份标志
    public Troll() {
    	weaponBehavior = new KnifeBehavior();
    	name = "troll";
    }
    //妖怪抢夺王后的行为
    public void abductQueen(){
    	System.out.println("now the Queen is belonging to me,Ha,ha,ha" + 
    		" i am a troll!");
    	}
}//类Troll的结束
/****************************************************************/
//实现武器行为接口
public class AxeBehavior implements WeaponBehavior {
public AxeBehavior() {//空构造器
    }
    //打印正在使用的武器
    public void useWeapon(){
    	System.out.println("Axe is good, but it needs you to be strong");
     }
 }//类AxeBehavior的结束
/****************************************************************/
//实现武器行为接口
public class BowAndArrowBehavior implements WeaponBehavior {

    public BowAndArrowBehavior() {
    }
    //打印正在使用的武器
    public void useWeapon(){
    	System.out.println("I'm using arrow,it's so powerful");
    }
}//类BowAndArrowBehavior的结束
/****************************************************************/
//实现武器行为接口
public class SwordBehavior implements WeaponBehavior{
public SwordBehavior() {//空构造器
    }
   //打印正在使用的武器
   public void useWeapon(){
    	System.out.println("I'm using a sword");
    }
}//类SwordBehavior的结束
/****************************************************************/
//实现武器行为的接口
public class SpearBehavior implements WeaponBehavior {

    public SpearBehavior() {
    }
    //打印正在使用的武器
    public void useWeapon(){
    	System.out.println("I'm using spear,it's sharp");
    }
}//类SpearBehavior的实现
/****************************************************************/
//实现武器行为接口
public class KnifeBehavior implements WeaponBehavior {
public KnifeBehavior() {//空构造器
    }
    //打印正在使用的武器
    public void useWeapon(){
    	System.out.println("I'm using a knife");
    }
}//类KnifeBehavior的结束
/********************************************************************/
public class simulCharacter {
    public static void main(String[] agrs){
    	    
    	    
    	    King king = new King();//国王是观察者模式中的主题
    	    Infantry infantry = new Infantry();//观察者
    	    Knight knight = new Knight();//观察者
    	    Troll troll  = new Troll(); //抢夺王后的妖怪
    	    Bowman bowman = new Bowman();//观察者
    	    Queen queen = new Queen();//观察者
    	    
    	    //王后被妖怪抢走
    	    troll.abductQueen();
    	   
    	    
    	    //国王召集兵马
    	    king.callOnArmy();
    	    
    	     System.out.println("\n\n");
    	    
    	    //通过registerObersever注册成为国王的兵马
    	    //接口Subject的一个方法 
    	    
    	    king.registerObserver(infantry);
    	    king.registerObserver(bowman);
    	    king.registerObserver(knight);
    	    
    	    //国王指挥作战
    	    //通知下属用何种兵器
    	    //king实现接口Subject从而有方法notifyObserver
    	    king.notifyObservers(new BowAndArrowBehavior());
    	    System.out.print("******************************************************\n" 
    	     +               "*  以下演示国王命令士兵使用弓箭(arrow)的效果         *\n"
    	     +               "*  后来步兵因为不习惯使用弓箭(arrow)改用长矛(spear)*\n"
    	     +               "*  测试动态更改武器的能力                            *\n"
    	     +               "******************************************************\n");
    	    //演示国王的命令是否发挥作用
    	    //国王命令下属使用弓箭
    	    //打印注册的成员使用的武器
    	    System.out.println(knight.getName());
    	    knight.fight();
    	    System.out.println(bowman.getName());
    	    bowman.fight();
    	    System.out.println(infantry.getName());
    	    infantry.fight();
    	    System.out.print("\n");
    	    
    	    //策略模式的应用
    	    //下属可以灵活使用封装的算法簇-----武器
    	 
    	    System.out.println("infantry::Now i'm changing weapon!");
    	    infantry.setWeapon(new SpearBehavior());
    	    //显示步兵现在使用的武器
    	    infantry.fight();
    	    
    	    
    	    
    	    System.out.print("******************************************************\n" 
    	     +               "*  以下演示国王命令士兵使用斧头(Axe)的效果           *\n"
    	     +               "*  后来弓箭手因为不习惯使用斧头(Axe)改用弓箭(arrow)  *\n"
    	     +               "*  测试动态更改武器的能力                            *\n"
    	     +               "******************************************************\n");
    	     king.notifyObservers(new AxeBehavior());
    	    //演示国王的命令是否发挥作用
    	    //国王命令下属使用斧头
    	    //打印注册的成员使用的武器
    	    System.out.println(knight.getName());
    	    knight.fight();
    	    System.out.println(bowman.getName());
    	    bowman.fight();
    	    System.out.println(infantry.getName());
    	    infantry.fight();
    	    System.out.print("\n");
    	    
    	    //策略模式的应用
    	    //下属可以灵活使用封装的算法簇---武器
    	    //弓箭手换回弓箭的使用
    	    System.out.println("bow::Now I'm changing weapon!");
    	    bowman.setWeapon(new BowAndArrowBehavior());
    	    
    	    //显示弓箭手换弓箭
    	    bowman.fight();
    	    
            System.out.print("*******************************************************\n" 
    	     +               "*  骑士战死沙场,国王把他从观察者列表中除名            *\n"
    	     +               "*  测试removeObserver的效果                           *\n"
    	     +               "*  观察骑士使用的武器(Axe,最后一次使用的武器)是否改变 *\n"
    	     +               "*  现在国王命令军队统一使用长矛(Spear)                *\n"
    	     +               "*******************************************************\n");
    	    
    	    //骑士战死沙场
    	    //国王只好把它从队列中移除
    	    king.removeObserver(knight);
    	   
    	    
    	    
    	    king.notifyObservers(new SpearBehavior());
    	    //国王命令最后一次轮换武器,准备把妖怪消灭
    	    //演示把knight从observer列表删除以后,看他能否收到通知
    	    System.out.println(knight.getName());
    	    knight.fight();
    	    System.out.println(bowman.getName());
    	    bowman.fight();
    	    System.out.println(infantry.getName());
    	    infantry.fight();
    	    
    	    System.out.print("*******************************************************\n" 
    	     +               "*  在国王的统一指挥下,在强大的策略模式支持下          *\n"
    	     +               "*  经过三种不同的武器的轮换攻击,终于消灭了妖怪        *\n"
    	     +               "*  国王救回了王后,恢复了PDK的宁静                     *\n"
    	     +               "*               End                                   *\n"             
    	     +               "*******************************************************\n");
    	  
    	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -