📄 电子版代码.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 + -