软件设计模式作业三行为式模式
软件设计模式行为式模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
简介
设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。
随着软件开发社群对设计模式的兴趣日益增长,已经出版了一些相关的专著,定期召开相应的研讨会,而且Ward Cunningham为此发明了WikiWiki用来交流设计模式的经验。
模式列表
设计模式分为三大类:创建型、结构型、行为型。创建型模式处理的是对象的创建过程(通过各种方式创建对象,使对象创建和管理变得简单),结构型模式处理的是对象/类的组合,行为型模式处理类和对象间的交互方式和任务分布。(只有类可以创建对象,接口只能被实现)
行为型设计模式
##行为式设计模式
- 职责链模式
- 组合命令模式
- 中介者模式
- 备忘录模式
- 观察者模式
- 状态模式
- 计划任务
- 完成任务
4、题目4-备忘录模式
4.1 作业题目
采用设计模式设计一款五子棋软件,使得该软件具有多次悔棋功能,即需要在系统中仔储棋子的多个历史状态(如棋子所处位置等).使用享元模式和备忘录模式模拟实现该过程。
4.2 所用模式结构视图
在这里插入图片描述
4.3 本实例类图
4.4 实例实现代码
package HH31备忘录模式;
import java.util.ArrayList;
public class HH31CareTaker {//状态管理类,对发起人要保存的状态进行记录,支持多步悔棋
private ArrayList<HH31ChessMemento> list = null;
public HH31CareTaker() {
super();
list = new ArrayList<HH31ChessMemento>();
}
public void addMemento(HH31ChessMemento c){
list.add(c);
}
public HH31ChessMemento huiQi(){
if(list.isEmpty()){
System.out.println("无法悔棋!!");
return null;
}
else{
int index = list.size();
HH31ChessMemento c = (HH31ChessMemento)list.get(index-1);
list.remove(index-1);
return c;
}
}
}
package HH31备忘录模式;
public class HH31ChessMemento {
private int x;
private int y;//象棋的当前坐标
private int id;//棋子的id
private String label;//棋子名称
public HH31ChessMemento(int x, int y, String label) {
super();
this.x = x;
this.y = y;
this.label = label;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
public String toString() {
return "黑棋前一个位置"+this.label+"当前位置为("+x+","+y+")";
}
}
package HH31备忘录模式;
public class HH31Client {
public static void main(String[] args) {
HH31CareTaker careTaker = new HH31CareTaker();
careTaker.huiQi();
HH31Originator o = new HH31Originator(1,1,"黑棋");
o.show();
careTaker.addMemento(o.CreatMemento());
o.setState(2,1);
o.show();
System.out.println("悔棋");
o.setMemento(careTaker.huiQi());
o.show();
o.setState(3,2);
o.show();
careTaker.addMemento(o.CreatMemento());
o.setState(4,5);
o.show();
careTaker.addMemento(o.CreatMemento());
o.setState(2,5);
o.show();
careTaker.addMemento(o.CreatMemento());
o.setState(6,3);
o.show();
System.out.println("悔棋");
o.setMemento(careTaker.huiQi());
o.show();
System.out.println("悔棋");
o.setMemento(careTaker.huiQi());
o.show();
System.out.println("悔棋");
o.setMemento(careTaker.huiQi());
o.show();
System.out.println("悔棋");
o.setMemento(careTaker.huiQi());
o.show();
}
}
package HH31备忘录模式;
public class HH31Originator {//发起人类,负责对当前操作的棋子的状态的表现,实现对状态的查看恢复和保存。
private int x;
private int y;//象棋的当前坐标
private int id;//棋子的id
private String label; //棋子名称
public HH31Originator(int x,int y,String label) {
super();
this.x = x;
this.y = y;
this.label = label;
}
public void setState(int x, int y) {
this.x = x;
this.y = y;
}
public HH31ChessMemento CreatMemento() {
return new HH31ChessMemento(x,y,label);
}
public void setMemento(HH31ChessMemento c){
if(c==null)return;
this.x = c.getX();
this.y = c.getY();
this.setId(c.getId());
this.label = c.getLabel();
}
public void show(){
System.out.println(CreatMemento());
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
源代码下载链接:
https://download.csdn.net/download/hha12138/13763468
作业文档下载链接:
https://download.csdn.net/download/hha12138/13764086
5、题目5-观察者模式
5.1 作业题目
某在线游戏支持多人联机对战,每个玩家都可以加人某一战队组成联盟,当战队巾某一成员受到敌人攻击时将给所有盟友发送通知,盟友收到通知后将做出响应。使用观发者模式和中介者模式设计并实现该过程。
5.2 所用模式结构视图
5.3 本实例类图
5.4 实例实现代码
package HH31观察者模式;
import java.util.ArrayList;
public abstract class HH31AllyControlCenter {
protected String allyName; //战队名称
protected ArrayList<HH31Observer> players = new ArrayList<HH31Observer>(); //定义一个集合用于存储战队成员
public void setAllyName(String allyName) {
this.allyName = allyName;
}
public String getAllyName() {
return this.allyName;
}
//注册方法
public void join(HH31Observer obs) {
System.out.println(obs.getName() + "加入" + this.allyName + "战队!");
players.add(obs);
}
//注销方法
public void quit(HH31Observer obs) {
System.out.println(obs.getName() + "退出" + this.allyName + "战队!");
players.remove(obs);
}
//声明抽象通知方法
public abstract void notifyObserver(String name);
}
package HH31观察者模式;
public class HH31Client {
public static void main(String[] args) {
//定义观察目标对象
HH31AllyControlCenter acc;
acc = new HH31ConcreteAllyControlCenter("湖人");
//定义四个观察者对象
HH31Observer player1,player2,player3,player4;
player1 = new HH31Player("詹姆斯");
acc.join(player1);
player2 = new HH31Player("戴维斯");
acc.join(player2);
player3 = new HH31Player("隆多");
acc.join(player3);
player4 = new HH31Player("格林");
acc.join(player4);
//某成员遭受攻击
player2.beAttacked(acc);
}
}
package HH31观察者模式;
public class HH31ConcreteAllyControlCenter extends HH31AllyControlCenter {
public HH31ConcreteAllyControlCenter(String allyName) {
System.out.println(allyName + "战队组建成功!");
System.out.println("----------------------------");
this.allyName = allyName;
}
//实现通知方法
public void notifyObserver(String name) {
System.out.println(this.allyName + "战队紧急通知,盟友" + name + "遭受敌人攻击!");
//遍历观察者集合,调用每一个盟友(自己除外)的支援方法
for(Object obs : players) {
if (!((HH31Observer)obs).getName().equalsIgnoreCase(name)) {
((HH31Observer)obs).help();
}
}
}
}
package HH31观察者模式;
public interface HH31Observer {//抽象观察类
public String getName();
public void setName(String name);
public void help(); //声明支援盟友方法
public void beAttacked(HH31AllyControlCenter acc); //声明遭受攻击方法
}
package HH31观察者模式;
public class HH31Player implements HH31Observer {//战队成员类:具体观察者类
private String name;
public HH31Player(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
//支援盟友方法的实现
public void help() {
System.out.println("稳住,"+this.name+"来救你!");
}
//遭受攻击方法的实现,当遭受攻击时将调用战队控制中心类的通知方法notifyObserver()来通知盟友
public void beAttacked(HH31AllyControlCenter acc) {
System.out.println(this.name+"被攻击!");
acc.notifyObserver(name);
}
}
源代码下载链接:
https://download.csdn.net/download/hha12138/13763468
作业文档下载链接:
https://download.csdn.net/download/hha12138/13764086
6、题目6-状态模式
6.1 作业题目
某纸牌游戏软件中,人物角色具有人门级(Primary)、熟练级(Secondary),高手绍(Professional)和骨灰级(Final)四种等级,角色的等级与其积分相对应,游戏胜利将增加和分,失败则扣除积分。人门级具有最基本的游戏功能 play(),熟练级增加丁游戏胜利积分加倍功能doubleScore),高手级在熟练级基础上再增加换牌功能 changeCards(),骨灰级在高手级基础上再增加偷看他人的牌功能 peekCards()。现使用状态模式来设计该系统,绘制类图并编程实现。
6.2 所用模式结构视图
6.3 本实例类图
6.4 实例实现代码
package HH31状态模式;
public class HH31AbstractState {
private HH31GameAccount rank;
private String name;
public HH31AbstractState(String name) {
// TODO Auto-generated constructor stub
this.name=name;
this.rank=new HH31PrimaryState(this);
}
public String getState() {
return rank.stateName; }
public void setState(HH31GameAccount rank) {
this.rank=rank; }
public HH31GameAccount getRank() {
return rank; }
public String getName() {
return name; }
public void play_loss() {
rank.play_loss();
}
public void play_win() {
rank.play_win();
}
public void doubleScore() {
rank.doubleScore();
}
public void changeCards() {
rank.changeCards();
}
public void peekCards() {
rank.peekCards();
}
}
package HH31状态模式;
public class HH31Client {
public static void main(String[] args) {
HH31AbstractState player=new HH31AbstractState("咩咩");
player.play_win();
player.peekCards();
player.changeCards();
player.play_win();
player.play_win();
player.play_win();
player.peekCards();
}
}
package HH31状态模式;
public class HH31FinalState extends HH31GameAccount {
public HH31FinalState(HH31GameAccount ranks) {
// TODO Auto-generated constructor stub
this.setPlayer(ranks.getPlayer());
this.score=ranks.getScore();
this.stateName="骨灰级"; }
public void doubleScore() {
// TODO Auto-generated method stub
System.out.println(stateName+getPlayer().getName()+"使用了胜利积分加倍");
this.score+=20;
}
public void changeCards() {
// TODO Auto-generated method stub
System.out.println(stateName+getPlayer().getName()+"使用了换牌功能");
}
public void peekCards() {
// TODO Auto-generated method stub
System.out.println(stateName+getPlayer().getName()+"使用了看牌功能");
}
}
package HH31状态模式;
public abstract class HH31GameAccount {
protected int score=0;
public HH31AbstractState player;
protected String stateName;
public void checkState(int score) {
if(score<=10) {
getPlayer().setState(new HH31PrimaryState(this));//入门
}else if (score<=20) {
getPlayer().setState(new HH31SecondaryState(this));//熟练
}else if (score<=30) {
getPlayer().setState(new HH31ProfessionState(this));//高手
}else if (score<=40) {
getPlayer().setState(new HH31FinalState(this));//骨灰
} }
public int getScore() {
return score; }
public void play_win() {
// TODO Auto-generated method stub
score=score+10;
checkState(score);
System.out.println(getPlayer().getState()+getPlayer().getName()+"赢了一场+10,当前积分:"+this.score);
}
public void play_loss() {
// TODO Auto-generated method stub
score-=10;
checkState(score);
System.out.println(getPlayer().getState()+getPlayer().getName()+"输了一场-10,当前积分:"+this.score);
}
public void doubleScore() {
// TODO Auto-generated method stub
System.out.println("对不起,你没有解锁此功能!");
}
public void changeCards() {
// TODO Auto-generated method stub
System.out.println("对不起,你没有解锁此功能!");
}
public void peekCards() {
// TODO Auto-generated method stub
System.out.println("对不起,你没有解锁此功能!");
}
public HH31AbstractState getPlayer() {
return player; }
public void setPlayer(HH31AbstractState player) {
this.player = player; }
}
```java
package HH31状态模式;
public class HH31PrimaryState extends HH31GameAccount {
public HH31PrimaryState(HH31GameAccount ranks) {
// TODO Auto-generated constructor stub
this.player=ranks.player;
this.score=ranks.getScore();
this.stateName="入门级"; }
public HH31PrimaryState(HH31AbstractState player) {
// TODO Auto-generated constructor stub
this.player=player;
this.score=0;
this.stateName="入门级"; }
}
```package HH31状态模式;
public class HH31ProfessionState extends HH31GameAccount {
public HH31ProfessionState(HH31GameAccount ranks) {
// TODO Auto-generated constructor stub
this.player=ranks.player;
this.score=ranks.getScore();
this.stateName="高手级"; }
public void doubleScore() {
// TODO Auto-generated method stub
System.out.println(stateName+player.getName()+"使用了胜利积分加倍");
this.score+=20;
}
public void changeCards() {
// TODO Auto-generated method stub
System.out.println(stateName+player.getName()+"使用了换牌功能");
}
}
package HH31状态模式;
public class HH31SecondaryState extends HH31GameAccount {
public HH31SecondaryState(HH31GameAccount ranks) {
this.player=ranks.player;
this.score=ranks.getScore();
this.stateName="熟练级";
}
public void doubleScore() {
// TODO Auto-generated method stub
System.out.println(stateName+player.getName()+"使用了胜利积分加倍");
this.score+=20;
}
}
源代码下载链接:
https://download.csdn.net/download/hha12138/13763468
作业文档下载链接:
https://download.csdn.net/download/hha12138/13764086