我是靠谱客的博主 大方外套,这篇文章主要介绍设计模式作业1,现在分享给大家,希望可以做个参考。

1.一个开宝箱游戏的基本描述为:游戏中有多种类型的人物(Role),如战士(Solider)、魔法师(Mage)等,主角的类型只能选择其中一种,且游戏中不再更改。游戏中还有各种宝箱(Box),如装有不同数目金钱的宝箱、装有毒物的宝箱等。当任一种类型的主角打开装有金钱的宝箱时,宝箱中的金钱会增加给主角,同时宝箱的金钱数目变成0;当战士打开装有毒物的宝箱时,战士的生命值(HP)会减少10%,但金钱(Money)增加20%;当魔法师打开装有毒物的宝箱时,魔法师的生命值(HP)会减少30%,但金钱(Money)增加40% 。

请根据上述描述,给出相应类的设计并完整实现,要求你的设计应具有良好的扩展性,如增加新角色类型及箱子种类时,不需要修改已有的设计及实现。

 

类设计:

通过派生不同的子类实现不同角色开启不同箱子产生的不同的效果

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
//box public abstract class Box { abstract void be_opened(Role role); } //role public abstract class Role { private int money,hp; abstract void open_box(Box box); abstract void poising(); public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } public int getHp() { return hp; } public void setHp(int hp) { this.hp = hp; } } //boxes public class Money_box extends Box{ private int money; public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } @Override void be_opened(Role role) { // TODO Auto-generated method stub role.setMoney(role.getMoney()+money); } } public class Poison_box extends Box{ @Override void be_opened(Role role) { // TODO Auto-generated method stub role.poising(); } } //roles public class Mage extends Role{ @Override void open_box(Box box) { // TODO Auto-generated method stub box.be_opened(this); } @Override void poising() { // TODO Auto-generated method stub this.setHp((int) (getHp()*0.7)); this.setMoney((int) (getMoney()*1.4)); } } public class Solider extends Role{ @Override void open_box(Box box) { // TODO Auto-generated method stub box.be_opened(this); } @Override void poising() { // TODO Auto-generated method stub this.setHp((int) (getHp()*0.9)); this.setMoney((int) (getMoney()*1.2)); } }

2.题目

给出适当的类设计和相应的代码:  有一个只能放进不能取出的盒子, 最多可放8个水果, 不一定一天放入。水果只是苹果和桔子两种, 它们放入盒子前的原始重量分别为50和30, 放入盒子后, 由于丢失水分, 它们的重量减轻, 苹果和桔子每天分别减轻4和3, 直到达到各自原始重量的3/5后, 不再减轻重量。盒子的功能有:  输出盒子中苹果的数量; 输出盒子中桔子的数量; 输出一天来盒子中水果减轻的总重量; 输出当前水果的总重量。

 

代码分析:这里水果放入为随机生成,假设考虑每两小时可选择是否放入水果及水果种类,按每六小时苹果重量减一,橘子重量每八小时减一

Fruits:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package test1.prec; public abstract class Fruits { protected String name; private int weight,min_weight,time; Fruits(){ setTime(0); name=new String("NULL"); weight=0; min_weight=0; } abstract void reduce(); void set_name(String name) { this.name=new String(name); } void set_weight(int weight) { this.weight=weight; } String get_name() { return name; } int get_weight() { return weight; } void set_min(int min) { this.min_weight=min; } int get_min() { return min_weight; } public int getTime() { return time; } public void setTime(int time) { this.time = time; } }

Apples:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package test1.prec; public class Apples extends Fruits { Apples(){ this.set_name("Apple"); this.setTime(0); this.set_weight(50); this.set_min(30); } @Override void reduce() { // TODO Auto-generated method stub this.set_weight(this.get_weight()-1); } }

Oranges:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package test1.prec; public class Oranges extends Fruits{ Oranges(){ this.set_name("Orange"); this.setTime(0); this.set_weight(30); this.set_min(18); } @Override void reduce() { // TODO Auto-generated method stub this.set_weight(get_weight()-1); } }

Box:由exist()函数记录盒子存在期间所有统计操作

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package test1.prec; public class Box { protected Fruits[] fruits; protected int size,len,time; protected int d_r,s_w; protected int a_num,o_num; Box(int time){ this.size=8; this.len=0; this.time=time; //为了简化按小时计时测试 this.fruits=new Fruits[size]; } void put_fruit(int k,Fruits fruit) { if(((len+k-1)<size)&&(k-1>=0)&&(k>0)) { for(int i=0;i<=k-1;i++) { if(fruit.name.equals("Apple")) { fruits[len]=new Apples(); this.a_num=this.a_num+1;//放入了1苹果 } else { this.o_num=this.o_num+1; fruits[len]=new Oranges();//放入了1桔子 } len++; } } } void sum_w() { for(int i=0;i<8&&fruits[i]!=null;i++) { s_w=s_w+fruits[i].get_weight(); } System.out.println("当前水果共重:"+s_w); } void exist() { int an = 0,on = 0; int j=0; for(;j<=time;j+=2) { an=(int)(Math.random()*(9-len)); on=(int)(Math.random()*(9-len)); if(len<8) { this.put_fruit(an, new Apples()); this.put_fruit(on, new Oranges()); } for(int i=0;(i<8)&&(fruits[i]!=null);i++) { if(fruits[i].get_min()<fruits[i].get_weight()) { if((fruits[i].getTime()!=0)&&((fruits[i].getTime()%6==0&&fruits[i].get_name().equals("Apple"))||(fruits[i].getTime()%8==0)&&fruits[i].get_name().equals("Orange"))) { fruits[i].reduce(); d_r=d_r+1; } } fruits[i].setTime(fruits[i].getTime()+2); } if(j%24==0&&j!=0) { System.out.println("第"+(j/24)+"天水分共减少:"+d_r); d_r = 0; } } System.out.println("第"+(j/24+1)+"天水分共减少:"+d_r); System.out.println("共有"+a_num+"个苹果和"+o_num+"个桔子"); sum_w(); } public static void main(String[] args) { // TODO Auto-generated method stub Box box=new Box(192); box.exist(); } }

输出样例:

3.题目

class B {

public:

   B(int n):data(n) { }

   int Data( ) const { return data; }

   void g1( );

   void g2( );

   void g3( );

private:  

   const int data;

};

void f( B& b ) {

   int condition = b.Data( );           

   if(condition == 1) { b.g1( ); }

   else if(condition == 5) { b.g2( ); }

   else if(condition == 9) { b.g3( ); }

}

当把此程序交给用户试用时, 针对函数f, 用户提出了一项新的要求: 当condition为100时, 依次执行b的成员函数g1( )和g2( )。经过进一步了解, 小王获悉: 以后可能还要增加处理condition的值是其它数值时的情况, 但这些需要分别处理的不同条件值的个数肯定不多。小王希望他写出的代码既能满足上述要求, 又不用每次都改写f的代码。请你帮小王重新设计, 使得新设计能够满足小王的愿望。简要说明你的设计思想, 给出实现代码。

 

设计思想:创建一个纯虚函数类,由其子类分别实现condition不同值下函数需要应对的不同情况,在不同情况下传入不同的对象指针调用不同的类对象函数。

类设计:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class B { public: B(int n) :data(n) { } int Data() const { return data; } void g1(); void g2(); void g3(); private: const int data; }; class A //虚基类 { public: virtual void func(B& b) = 0; }; class A1 :public A { public: void func(B& b){ b.g1(); } }; class A5 :public A { public: void func(B& b){ b.g2(); } }; class A9 :public A { public: void func(B& b){ b.g3(); } }; class A100 :public A { public: void func(B& b){ b.g1(); b.g2(); } }; void f(B& b,A* a) { a->func(b); } //传入A1则对应condition=1的情况,以此类推

ps:作业笔记

最后

以上就是大方外套最近收集整理的关于设计模式作业1的全部内容,更多相关设计模式作业1内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部