软件设计模式行为式模式

软件设计模式作业三行为式模式

软件设计模式行为式模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

简介

设计模式(英语 design pattern)是对面向对象设计中反复出现的问题的解决方案。这个术语是在1990年代由Erich Gamma等人从建筑设计领域引入到计算机科学中来的。这个术语的含义还存有争议。算法不是设计模式,因为算法致力于解决问题而非设计问题。设计模式通常描述了一组相互紧密作用的类与对象。设计模式提供一种讨论软件设计的公共语言,使得熟练设计者的设计经验可以被初学者和其他设计者掌握。设计模式还为软件重构提供了目标。

随着软件开发社群对设计模式的兴趣日益增长,已经出版了一些相关的专著,定期召开相应的研讨会,而且Ward Cunningham为此发明了WikiWiki用来交流设计模式的经验。

模式列表

设计模式分为三大类:创建型、结构型、行为型。创建型模式处理的是对象的创建过程(通过各种方式创建对象,使对象创建和管理变得简单),结构型模式处理的是对象/类的组合,行为型模式处理类和对象间的交互方式和任务分布。(只有类可以创建对象,接口只能被实现)

行为型设计模式

##行为式设计模式

  1. 职责链模式
  2. 组合命令模式
  3. 中介者模式
  4. 备忘录模式
  5. 观察者模式
  6. 状态模式
  • 计划任务
  • 完成任务

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hha12138

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值