设计模式实验之三维度桥接模式

目录

一、问题描述

二、问题分析

三、UML图

四、代码实现

五、实验结果截图

六、结尾语


一、问题描述

 设计一个游戏角色创建系统,角色有性别之分:男性 (Man)和女性(Female);有种族之分:人类 (Human)、矮人 (Dwarf)、兽人 (Orc)、牛头人(Tauren);有职业之分:战士 (Warrior)、法师(Mage)、牧师(Priest)、猎人(Hunter)。

二、问题分析

采用桥接模式,相信智慧的你已经在课本上或者其他途径学习了桥接模式,课本上的栗子就是画笔pen和颜色color进行桥接,而这是两个维度的。在本题中有性别,种族,职业三个维度,我们将将职业与种族桥接,种族与性别桥接,性别作为"桥头"。

三、UML图

四、代码实现

1)客户端类

import java.util.Scanner;

public class Client {
    public static void main(String[] args){
        Procession procession;
        Race race;
        Sex sex;
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        int choice;
        System.out.println("现在开始创建角色,请选择您想要创建角色的性别:\n1.男性 2.女性");
        choice = sc.nextInt();
        switch (choice){
            case 1->sex = new Man();
            case 2->sex = new Female();
            default -> throw new RuntimeException("不存在的性别");
        }
        System.out.println("请选择角色的种族");
        System.out.println("1.人类 2.矮人 3.兽人 4.牛头人");
        choice = sc.nextInt();
        switch (choice){
            case 1->race = new Human();
            case 2->race = new Dwarf();
            case 3->race = new Orc();
            case 4->race = new Tauren();
            default -> throw new RuntimeException("不存在此种族选择");
        }
        System.out.println("请选择角色的职业");
        System.out.println("1.战士 2.法师 3.牧师 4.猎人");
        choice = sc.nextInt();
        switch (choice){
            case 1->procession = new Warrior();
            case 2->procession = new Mage();
            case 3->procession = new Priest();
            case 4->procession = new Hunter();
            default -> throw new RuntimeException("不存在此职业选择");
        }
//        System.out.println("进入创建方法");
//        procession = (Procession) XMLUtil.getBean("Procession");
//        race = (Race) XMLUtil.getBean("Race");
//        sex = (Sex) XMLUtil.getBean("Sex");

        sex.setRace(race);
        race.setProcession(procession);
        sex.createLife();
    }
}

2)性别Sex
 

public abstract class Sex {
    public Race race;
    public void setRace(Race race){
        this.race = race;
    }

    public abstract void createLife();
}

3)种族Race
 

public abstract class Race {
    public Procession procession;
    public void setProcession(Procession procession){
        this.procession = procession;
    }

    public abstract void races(String sex);
}

4)职业Procession
 

public abstract class Procession {
    public abstract void releaseSkills(String sex, String raceName);
}

5)具体子类Warrior(战士)
 

import java.util.Scanner;

public class Warrior extends Procession{
    Scanner sc = new Scanner(System.in);
//    String skillResult;//释放技能后的效果,根据不同的技能名来匹配
    @Override
    public void releaseSkills(String sex, String raceName) {
        String processionName = "战士";
        String skillName;
        System.out.println("英勇无畏的战士啊,您已经学会的技能如下,请选择您想要释放的技能:");
        System.out.println("1.英勇飞跃 2.大地崩击 3.顺劈砍");
        int choose = sc.nextInt();
        switch (choose){
            case 1:skillName = "英勇飞跃";break;
            case 2:skillName = "大地崩击";break;
            case 3:skillName = "顺劈砍";break;
            default:throw new RuntimeException("您还未学会其他的技能呢,请再接再励吧!");
        }
        System.out.println(sex+raceName+processionName+"释放了技能"+skillName);
    }
}

6)具体子类Mage(法师)
 

import java.util.Scanner;

public class Mage extends Procession{
    Scanner sc = new Scanner(System.in);
//    String skillResult;//释放技能后的效果,根据不同的技能名来匹配
    @Override
    public void releaseSkills(String sex, String raceName) {
        String processionName = "法师";
        String skillName;
        System.out.println("智冠天下的法师啊,您已经学会的技能如下,请选择您想要释放的技能:");
        System.out.println("1.浩劫水啸 2.心灵之涟 3.空间律动");
        int choose = sc.nextInt();
        switch (choose){
            case 1:skillName = "海啸天击";break;
            case 2:skillName = "心灵之涟";break;
            case 3:skillName = "空间律动";break;
            default:throw new RuntimeException("您还未学会其他的技能呢,请再接再励吧!");
        }
        System.out.println(sex+raceName+processionName+"吟唱技能"+skillName);
    }
}

7)具体子类Priest(牧师)
 

import java.util.Scanner;

public class Priest extends Procession{
    Scanner sc = new Scanner(System.in);
//    String skillResult;//释放技能后的效果,根据不同的技能名来匹配
    @Override
    public void releaseSkills(String sex, String raceName) {
        String processionName = "牧师";
        String skillName;
        System.out.println("仁慈宽厚的牧师啊,您已经学会的技能如下,请选择您想要释放的技能:");
        System.out.println("1.圣光之盾 2.治愈之光 3.绝望祷言");
        int choose = sc.nextInt();
        switch (choose){
            case 1:skillName = "圣光之盾";break;
            case 2:skillName = "治愈之光";break;
            case 3:skillName = "绝望祷言";break;
            default:throw new RuntimeException("您还未学会其他的技能呢,请再接再励吧!");
        }
        System.out.println(sex+raceName+processionName+"开始吟唱技能"+skillName);
    }
}

8)具体子类Hunter(猎人)
 

import java.util.Scanner;

public class Hunter extends Procession{
    Scanner sc = new Scanner(System.in);
//    String skillResult;//释放技能后的效果,根据不同的技能名来匹配
    @Override
    public void releaseSkills(String sex, String raceName) {
        String processionName = "猎人";
        String skillName;
        System.out.println("机智勇敢的猎人啊,您已经学会的技能如下,请选择您想要释放的技能:");
        System.out.println("1.隐秘之阱 2.鹰之守护 3.致命枪决");
        int choose = sc.nextInt();
        switch (choose){
            case 1:skillName = "隐秘之阱";break;
            case 2:skillName = "鹰之守护";break;
            case 3:skillName = "致命枪决";break;
            default:throw new RuntimeException("您还未学会其他的技能呢,请再接再励吧!");
        }
        System.out.println(sex+raceName+processionName+"发动技能"+skillName);
    }
}

9)具体子类Human(人类)
 

public class Human extends Race{
    @Override
    public void races(String sex) {
        String raceName = "人类";
        this.procession.releaseSkills(sex,raceName);
    }
}

10)具体子类Dwarf(矮人)
 

public class Dwarf extends Race{
    @Override
    public void races(String sex) {
        String raceName = "矮人";
        this.procession.releaseSkills(sex,raceName);
    }
}

11)具体子类Orc(兽人)
 

public class Orc extends Race{
    @Override
    public void races(String sex) {
        String raceName = "兽人";
        this.procession.releaseSkills(sex,raceName);
    }
}

12)具体子类Tauren(牛头人)
 

public class Tauren extends Race{
    @Override
    public void races(String sex) {
        String raceName = "牛头人";
        this.procession.releaseSkills(sex,raceName);
    }
}

 13)具体子类Female(女性)
 

public class Female extends Sex{
    @Override
    public void createLife() {
        String sex = "女性";
        this.race.races(sex);
    }
}

14)具体子类Man(男性)

public class Man extends Sex{
    @Override
    public void createLife() {
        String sex = "男性";
        this.race.races(sex);
    }
}


五、实验结果截图

六、结尾语

程序放在同一目录下就能运行,不过还是有一些不足,一是并没有使用xml,XMLUtil这些来实现。二是后面那个创建功能并没有起到应有的预期结果,虽然对整个实验没什么区别。不多说了,去上课啦,希望多多交流。。。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值